Как реализованы didSet и willSet в Swift? - PullRequest
2 голосов
/ 19 июня 2019

Я пытаюсь понять реализацию willSet и didSet в Swift.Я хотел бы знать, есть ли так или иначе, под капотом, swift полагается на механизм Obj-C KVO, когда var объявлен следующим образом.Примечание: это используется в приложении Какао.Я должен объявить переменную как динамическую @objc, чтобы связать эту переменную с элементом управления в пользовательском интерфейсе.

@objc dynamic var someString: String? = nil {
        didSet {
            self.doSomething()
        }
    }

Ответы [ 2 ]

2 голосов
/ 19 июня 2019

willSet/didSet и @objc dynamic - две разные вещи.

  • willSet/didSet - это легкие Наблюдатели свойств , которые не зависят от КВО.
  • @objc dynamic выставляет свойство Objective-C KVO.Требуется для привязки какао
0 голосов
/ 20 июня 2019

Нет, они не полагаются на КВО.Чтобы доказать это, давайте посмотрим на код, который didSet и willSet являются синтаксическим сахаром для

var x = 0;

func setX(newX:Int):Int {
   willSet()
   x = newX
   didSet()
}

Вместо того, чтобы писать все вышеперечисленные шаблоны для этого Swift, просто создается нечто похожее под капотом.Если это помогает думать о = как о простой функции над тем, что слева имеет сторону равенства.Если я вызываю = для свойства, это просто вызывает функцию set для этого свойства.Под капотом, когда я вызываю = свойство, Swift будет вызывать didSet и willSet, как описано выше.Точная реализация может выглядеть немного иначе, но приведенный выше фрагмент должен по крайней мере убедить вас в том, что нет необходимости реализовывать наблюдатели свойств с помощью KVO, и что, если вы покопаетесь глубоко в исходном коде для swift, вы обнаружите, что это didSet и willSet иСами вычисленные свойства являются просто синтаксическим сахаром для приведенного выше кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...