Swift Array
- это struct
, а struct
s имеют тип значения, что означает, что они полностью изменяются при добавлении / удалении / замене элементов.Следовательно, когда вы добавляете / удаляете / заменяете Note
, наблюдатель свойства didSet
вызывается, так как массив снова set
.
Однако, по вашему вопросу:
Есть ли способ печатать ("привет") каждый раз, когда один из объектов Note в массиве изменяется?
Этим я предполагаю, что вы хотите что-то сделать, когдадоступ к элементу в этом массиве и изменение внутреннего свойства.
Это было бы хорошо, если бы вы имели дело только с объектами типа значения, т. е. если бы ваш Note
объект также был struct
, тогдаизменение чего-либо внутри одного Note
также привело бы к изменению массива.
Но ваш Note
объект является классом, то есть ссылочным типом, и остается тем же объектом, даже если его внутренние элементы изменяются.Следовательно, ваш массив не нуждается в обновлении, и didSet
не вызывается.
Чтение: типы значений и ссылок
KVO Solution:
Сейчас ... Так как ваш Note
является подклассом NSObject
, вы можете использовать концепцию KVO
Согласно следующему рабочему примеру, мы наблюдаем толькоодно свойство класса Note
.
Если вы хотите наблюдать больше свойств, вам нужно будет наблюдать еще эти много ключей .
Пример:
class Note: NSObject {
@objc dynamic var content = ""
init(_ content: String) {
self.content = content
}
}
class NoteList {
var notes: [Note] = [] {
didSet {
print("note list updated")
//register & save observers for each note
self.noteMessageKVOs = notes.map { (note) -> NSKeyValueObservation in
return note.observe(\Note.content, options: [.new, .old]) { (note, value) in
print("note updated: \(value.oldValue) changed to \(value.newValue)")
}
}
}
}
//array of observers
var noteMessageKVOs = [NSKeyValueObservation]()
}
let list = NoteList()
list.notes.append(Note("A")) //note list updated
list.notes.append(Note("B")) //note list updated
list.notes[0].content = "X" //note updated: A changed to X
list.notes[1].content = "Y" //note updated: B changed to Y
Примечания:
NSObject
требуется для KVO @objc dynamic
требуется, чтобы сделать свойство наблюдаемым \Note.message
- это путь к ключу noteMessageKVOs
требуется для поддержания наблюдателей в живых