Swift屬性監視器
屬性監視器
屬性監視器監控和響應屬性值的變化,每次屬性被設置值的時候都會調用屬性監視器,甚至新的值和現在的值相同的時候也不例外。
可以爲除了延遲存儲屬性之外的其他存儲屬性添加屬性監視器,也可以通過重載屬性的方式爲繼承的屬性(包括存儲屬性和計算屬性)添加屬性監視器。屬性重載請參考繼承一章的重載。
注意:
不需要爲無法重載的計算屬性添加屬性監視器,因爲可以通過 setter 直接監控和響應值的變化。
可以爲屬性添加如下的一個或全部監視器:
-
willSet
在設置新的值之前調用 -
didSet
在新的值被設置之後立即調用
willSet
監視器會將新的屬性值作爲固定參數傳入,在willSet
的實現代碼中可以爲這個參數指定一個名稱,如果不指定則參數仍然可用,這時使用默認名稱newValue
表示。
類似地,didSet
監視器會將舊的屬性值作爲參數傳入,可以爲該參數命名或者使用默認參數名oldValue
。
<<<<<<< HEAD
注意:
willSet
和didSet
監視器在屬性初始化過程中不會被調用,他們只會當屬性的值在初始化之外的地方被設置時被調用。注意:
willSet
和didSet
監視器在屬性初始化過程中不會被調用,它們只會當屬性的值在初始化之外的地方被設置時被調用。a516af6a531a104ec88da0d236ecf389a5ec72af
這裏是一個willSet
和didSet
的實際例子,其中定義了一個名爲StepCounter
的類,用來統計當人步行時的總步數,可以跟計步器或其他日常鍛鍊的統計裝置的輸入數據配合使用。
class StepCounter {
var totalSteps: Int = 0 {
willSet(newTotalSteps) {
println("About to set totalSteps to \(newTotalSteps)")
}
didSet {
if totalSteps > oldValue {
println("Added \(totalSteps - oldValue) steps")
}
}
}
}
let stepCounter = StepCounter()
stepCounter.totalSteps = 200
// About to set totalSteps to 200
// Added 200 steps
stepCounter.totalSteps = 360
// About to set totalSteps to 360
// Added 160 steps
stepCounter.totalSteps = 896
// About to set totalSteps to 896
// Added 536 steps
StepCounter
類定義了一個Int
類型的屬性totalSteps
,它是一個存儲屬性,包含willSet
和didSet
監視器。
當totalSteps
設置新值的時候,它的willSet
和didSet
監視器都會被調用,甚至當新的值和現在的值完全相同也會調用。
例子中的willSet
監視器將表示新值的參數自定義爲newTotalSteps
,這個監視器只是簡單的將新的值輸出。
didSet
監視器在totalSteps
的值改變後被調用,它把新的值和舊的值進行對比,如果總的步數增加了,就輸出一個消息表示增加了多少步。didSet
沒有提供自定義名稱,所以默認值oldValue
表示舊值的參數名。
注意:
如果在didSet
監視器裏爲屬性賦值,這個值會替換監視器之前設置的值。