Swift 擁有類似 C# 的屬性聲明語法:
var foo : int {
get { return getFoo() }
set { setFoo(newValue) }
}
但是玄帕,Swift 還另有 willSet
和 didSet
行為部脚。它們分別在調(diào)用 setter 之前和之后被調(diào)用。那它們存在的意義是什么桨仿?畢竟考慮到在 setter 里可以寫出完全相同的代碼睛低。
其實(shí)關(guān)鍵在于,有時候我們需要存儲屬性時自動進(jìn)行某些行為服傍,例如通知其它對象钱雷,這個屬性被改變了。如果只有 get/set
吹零,就需要另一個字段來保存改動之前的值罩抗。借助 willSet
和 didSet
,值被修改時進(jìn)行的行為就不需要額外的字段了灿椅。例如套蒂,在這個例子中:
class Foo {
var myProperty: Int = 0 {
didSet {
print("myProperty 的值從 \(oldValue) 更改為 \(myProperty)")
}
}
}
每當(dāng) myProperty 被修改時都會輸出舊的值和新的值。但如果只有 getter 和 setter茫蛹,就需要這樣做:
class Foo {
var myPropertyValue: Int = 0
var myProperty: Int {
get { return myPropertyValue }
set {
print("myProperty 的值從 \(myPropertyValue) 更改為 \(myProperty)")
myPropertyValue = newValue
}
}
}
所以 willSet
和 didSet
可以節(jié)省幾行代碼操刀,并且精簡了字段列表。
另外注意:根據(jù)蘋果的注釋婴洼,在初始化方法中設(shè)置屬性不會調(diào)用 willSet 和 didSet:willSet and didSet observers are not called when a property is first initialized. They are only called when the property’s value is set outside of an initialization context.