swift 屬性觀察器

Inlight發表於2017-12-19

概念

用來監視屬性值變化,當屬性值發生改變時可以對此作出響應。可以為除了延遲儲存屬性之外的其他儲存屬性新增屬性觀察器,也可以通過過載屬性的方式為繼承的屬性(包括儲存屬性和計算屬性)新增屬性觀察器。

  • willset 觀察器會將新的屬性值作為固定引數傳入,在willSet的實現程式碼中可以為這個引數指定一個名稱,如果不指定則引數仍然可用,這時使用預設名稱 newValue 表示。
  • didSet 觀察器會將舊的屬性值作為引數傳入,可以為該引數命名或者使用預設引數名 oldValue

使用

swift 屬性擁有 set get 語法

var score : int {
    get { return getNum() }
    set { setBum(newValue) }
}
複製程式碼

willSetdidSet 分別在呼叫 set 方法之前和之後被呼叫,其意義在於有時候我們需要在儲存屬性時做一些事情,例如通知某個物件,這個屬性被改變了。如果只有 get set 方法,我們就需要宣告另外一個欄位來儲存改動之前的值。藉助 willSetdidSet 方法就不需要額外的欄位了,直接使用 newValueoldValue 就可以了。

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
複製程式碼

注意

  • willSetdidSet 觀察器在屬性初始化過程中不會被呼叫,它們只會當屬性的值在初始化之外的地方被設定時被呼叫。
  • 即使是設定的值和原來值相同,willSetdidSet 也會被呼叫。

相關文章