如何在Swift中实现didSet和willSet

时间:2019-06-19 17:50:51

标签: swift cocoa

我试图了解Swift中willSet和didSet的实现。我想知道在声明如下var时,在幕后是否仍然依赖于Obj-C KVO机制。 注意:这在Cocoa应用程序中使用。我必须将var声明为@objc dynamic,以便将此var绑定到UI上的控件。

setter

2 个答案:

答案 0 :(得分:2)

willSet/didSet@objc dynamic是两件事。

  • willSet/didSet是轻量级的Property Observers,独立于KVO。
  • @objc dynamic将属性公开给Objective-C KVO。可可绑定是必需的

答案 1 :(得分:0)

不,他们不依赖KVO。为了证明这一点,让我们看一下didSet和willSet是它们的语法糖的代码

var x = 0;

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

无需为Swift编写上面所有的样板,只需在幕后生成类似的内容即可。如果它有助于将=视为简单的等式左边的set函数。如果我在某个属性上调用=,则只是在该属性上调用set函数。当我在属性上调用=时,Swift将像上面一样调用didSet和willSet。确切的实现可能看起来有些不同,但是上面的代码片段至少应该说服您使用KVO来实现属性观察器是不必要的,并且如果您深入研究源代码以进行快速查找,您会发现didSet和willSet和对于以上代码,计算属性本身仅仅是语法糖。