位置:首頁 > 高級語言 > Swift教學 > Swift屬性監視器

Swift屬性監視器

屬性監視器

屬性監視器監控和響應屬性值的變化,每次屬性被設置值的時候都會調用屬性監視器,甚至新的值和現在的值相同的時候也不例外。

可以為除了延遲存儲屬性之外的其他存儲屬性添加屬性監視器,也可以通過重載屬性的方式為繼承的屬性(包括存儲屬性和計算屬性)添加屬性監視器。屬性重載請參考繼承一章的重載


注意:
不需要為無法重載的計算屬性添加屬性監視器,因為可以通過 setter 直接監控和響應值的變化。
 

可以為屬性添加如下的一個或全部監視器:

  • willSet在設置新的值之前調用
  • didSet在新的值被設置之後立即調用

willSet監視器會將新的屬性值作為固定參數傳入,在willSet的實現代碼中可以為這個參數指定一個名稱,如果不指定則參數仍然可用,這時使用默認名稱newValue表示。

類似地,didSet監視器會將舊的屬性值作為參數傳入,可以為該參數命名或者使用默認參數名oldValue

<<<<<<< HEAD


注意:

willSetdidSet監視器在屬性初始化過程中不會被調用,他們隻會當屬性的值在初始化之外的地方被設置時被調用。

注意:

willSetdidSet監視器在屬性初始化過程中不會被調用,它們隻會當屬性的值在初始化之外的地方被設置時被調用。

a516af6a531a104ec88da0d236ecf389a5ec72af
 

這裡是一個willSetdidSet的實際例子,其中定義了一個名為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,它是一個存儲屬性,包含willSetdidSet監視器。

totalSteps設置新值的時候,它的willSetdidSet監視器都會被調用,甚至當新的值和現在的值完全相同也會調用。

例子中的willSet監視器將表示新值的參數自定義為newTotalSteps,這個監視器隻是簡單的將新的值輸出。

didSet監視器在totalSteps的值改變後被調用,它把新的值和舊的值進行對比,如果總的步數增加了,就輸出一個消息表示增加了多少步。didSet冇有提供自定義名稱,所以默認值oldValue表示舊值的參數名。


注意:
如果在didSet監視器裡為屬性賦值,這個值會替換監視器之前設置的值。