В Swift вы можете отслеживать изменения в массиве с помощью Key-Value Observing (KVO) или с использованием NotificationCenter. Оба подхода позволяют вам разделить изменения на вставку/удаление и модификацию.
1. Использование Key-Value Observing (KVO):
KVO позволяет наблюдать за изменением свойств объекта, включая массивы. Для отслеживания изменения массива вам понадобится определить класс, который будет являться наблюдателем, и указать, какие свойства массива вам интересны.
Пример:
class ArrayObserver: NSObject { @objc dynamic var array: [Int] = [] override init() { super.init() self.addObserver(self, forKeyPath: "array", options: [.old, .new], context: nil) } deinit { self.removeObserver(self, forKeyPath: "array") } override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { if keyPath == "array", let change = change { if let newArr = change[.newKey] as? [Int], let oldArr = change[.oldKey] as? [Int] { // проверяем разницу между старым и новым массивами let inserted = Array(Set(newArr).subtracting(oldArr)) let removed = Array(Set(oldArr).subtracting(newArr)) let modified = Array(Set(newArr).intersection(oldArr)) if !inserted.isEmpty { print("Добавлены элементы: (inserted)") } if !removed.isEmpty { print("Удалены элементы: (removed)") } if !modified.isEmpty { print("Изменены элементы: (modified)") } } } } } var observer = ArrayObserver() observer.array = [1, 2, 3, 4] observer.array.append(5) observer.array.removeFirst()
2. Использование NotificationCenter:
NotificationCenter позволяет отправлять уведомления о изменениях в приложении, которые могут быть отслежены другими объектами. Вам понадобится определить класс, который будет отправлять уведомления, и подписаться на эти уведомления в наблюдателе.
Пример:
class NotificationSender { static let arrayDidChangeNotification = Notification.Name("ArrayDidChangeNotification") static func postArrayDidChangeNotification(inserted: [Int], removed: [Int], modified: [Int]) { NotificationCenter.default.post(name: arrayDidChangeNotification, object: nil, userInfo: [ "inserted": inserted, "removed": removed, "modified": modified ]) } } class ArrayObserver { init() { NotificationCenter.default.addObserver(self, selector: #selector(handleArrayDidChangeNotification(_:)), name: NotificationSender.arrayDidChangeNotification, object: nil) } deinit { NotificationCenter.default.removeObserver(self) } @objc func handleArrayDidChangeNotification(_ notification: Notification) { if let userInfo = notification.userInfo { if let inserted = userInfo["inserted"] as? [Int] { if !inserted.isEmpty { print("Добавлены элементы: (inserted)") } } if let removed = userInfo["removed"] as? [Int] { if !removed.isEmpty { print("Удалены элементы: (removed)") } } if let modified = userInfo["modified"] as? [Int] { if !modified.isEmpty { print("Изменены элементы: (modified)") } } } } } var observer = ArrayObserver() NotificationSender.postArrayDidChangeNotification(inserted: [1, 2, 3, 4], removed: [1], modified: [2])
Оба примера покрывают изменение массива, разделяя его на вставку/удаление и модификацию. Вы можете выбрать способ, который лучше подходит для вашего случая использования.