Swift具有类似于C#的属性声明语法:
var foo: Int { get { return getFoo() } set { setFoo(newValue) } }
但是,它也具有willSet和didSet动作。这些分别在设置器被调用之前和之后被调用。考虑到setter内可能只有相同的代码,它们的目的是什么?
willSet
didSet
重点似乎是有时您需要一个具有自动存储 和 某些行为的属性,例如,通知其他对象该属性刚刚更改。当您只有get/时set,您需要另一个字段来保存值。使用willSet和didSet,可以在修改值时采取措施,而无需其他字段。例如,在该示例中:
get
set
class Foo { var myProperty: Int = 0 { didSet { print("The value of myProperty changed from \(oldValue) to \(myProperty)") } } }
myProperty每次修改时都会打印其新旧值。仅使用getter和setter,我将需要以下内容:
myProperty
class Foo { var myPropertyValue: Int = 0 var myProperty: Int { get { return myPropertyValue } set { print("The value of myProperty changed from \(myPropertyValue) to \(newValue)") myPropertyValue = newValue } } }
因此willSet,didSet代表了几行的经济性,并且字段列表中的噪音更少。