Я пытаюсь понять реализацию willSet и didSet в Swift. Я хотел бы знать, есть ли под капотом Swift полагается на механизм Obj-C KVO, когда var объявляется следующим образом. Примечание. Это используется в приложении Cocoa. Я должен объявить переменную как @objc dynamic, чтобы связать эту переменную с элементом управления в пользовательском интерфейсе.
@objc dynamic var someString: String? = nil {
didSet {
self.doSomething()
}
}
Да, это чистые быстрые концепции. Но что меня беспокоит, так это динамическая часть @objc объявления var
willSet/didSet
и @objc dynamic
это разные вещи.
willSet/didSet
являются облегченными Наблюдатели за недвижимостью, которые не зависят от KVO.@objc dynamic
предоставляет объект объекту Objective-C KVO. Требуется для Cocoa BindingsСогласованный. Означает ли это, что внутренне propertyObservers полагаются на Obj-C KVO для запуска привязок? Я имею в виду, объявляя @objc динамическим, запускаем ли мы Obj-C KVO для работы привязок?
Нет, как я уже сказал ...независимы от КВО
Нет, на КВО не полагаются. Чтобы доказать это, давайте посмотрим на код, в котором didSet и willSet являются синтаксическим сахаром для
var x = 0;
func setX(newX:Int):Int {
willSet()
x = newX
didSet()
}
Вместо того, чтобы писать все вышеперечисленные шаблоны для этого, Swift просто генерирует что-то подобное под капотом. Если это поможет, подумайте о = как о простой функции набора для того, что находится слева от равенства. Если я вызываю = для свойства, это просто вызывает функцию set для этого свойства. Под капотом, когда я вызываю = для свойства, Swift вызывает didSet и willSet, как указано выше. Точная реализация может выглядеть немного по-другому, но приведенный выше фрагмент должен, по крайней мере, убедить вас в том, что нет необходимости реализовывать наблюдатели свойств с помощью KVO, и что если вы покопаетесь в исходном коде для swift, вы обнаружите, что это didSet и willSet и сами вычисляемые свойства являются просто синтаксическим сахаром для приведенного выше кода.
Я не думаю, что наблюдатели за собственностью Swift основаны на KVO.