用來監視屬性值變化,當屬性值發生改變時能夠對此做出響應。能夠爲除了延遲存儲屬性以外的其餘存儲屬性添加屬性觀察器,也能夠經過重載屬性的方式爲繼承的屬性(包括存儲屬性和計算屬性)添加屬性觀察器。swift
willset
觀察器會將新的屬性值做爲固定參數傳入,在willSet的實現代碼中能夠爲這個參數指定一個名稱,若是不指定則參數仍然可用,這時使用默認名稱 newValue
表示。didSet
觀察器會將舊的屬性值做爲參數傳入,能夠爲該參數命名或者使用默認參數名 oldValue
。swift 屬性擁有 set
get
語法bash
var score : int { get { return getNum() } set { setBum(newValue) } } 複製代碼
willSet
和 didSet
分別在調用 set
方法以前和以後被調用,其意義在於有時候咱們須要在存儲屬性時作一些事情,例如通知某個對象,這個屬性被改變了。若是隻有 get
set
方法,咱們就須要聲明另一個字段來保存改動以前的值。藉助 willSet
和 didSet
方法就不須要額外的字段了,直接使用 newValue
和 oldValue
就能夠了。markdown
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 複製代碼
輸出spa
will set score to 60 did set score to 0 will set score to 99 did set score to 60 複製代碼
willSet
和 didSet
觀察器在屬性初始化過程當中不會被調用,它們只會當屬性的值在初始化以外的地方被設置時被調用。willSet
和 didSet
也會被調用。