我试图了解Swift中willSet和didSet的实现。我想知道在声明如下var时,在幕后是否仍然依赖于Obj-C KVO机制。 注意:这在Cocoa应用程序中使用。我必须将var声明为@objc dynamic,以便将此var绑定到UI上的控件。
setter
答案 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和对于以上代码,计算属性本身仅仅是语法糖。