概念
用來監視屬性值變化,當屬性值發生改變時可以對此作出響應。可以為除了延遲儲存屬性之外的其他儲存屬性新增屬性觀察器,也可以通過過載屬性的方式為繼承的屬性(包括儲存屬性和計算屬性)新增屬性觀察器。
willset
觀察器會將新的屬性值作為固定引數傳入,在willSet的實現程式碼中可以為這個引數指定一個名稱,如果不指定則引數仍然可用,這時使用預設名稱newValue
表示。didSet
觀察器會將舊的屬性值作為引數傳入,可以為該引數命名或者使用預設引數名oldValue
。
使用
swift 屬性擁有 set
get
語法
var score : int {
get { return getNum() }
set { setBum(newValue) }
}
複製程式碼
willSet
和 didSet
分別在呼叫 set
方法之前和之後被呼叫,其意義在於有時候我們需要在儲存屬性時做一些事情,例如通知某個物件,這個屬性被改變了。如果只有 get
set
方法,我們就需要宣告另外一個欄位來儲存改動之前的值。藉助 willSet
和 didSet
方法就不需要額外的欄位了,直接使用 newValue
和 oldValue
就可以了。
class Student {
var score: Int = 0 {
willSet{
print("will set score to \(newValue)")
}
didSet{
print("did set score to \(oldValue)")
}
}
}
let student = Student()
student.score = 60
student.score = 99
複製程式碼
輸出
will set score to 60
did set score to 0
will set score to 99
did set score to 60
複製程式碼
注意
willSet
和didSet
觀察器在屬性初始化過程中不會被呼叫,它們只會當屬性的值在初始化之外的地方被設定時被呼叫。- 即使是設定的值和原來值相同,
willSet
和didSet
也會被呼叫。