屬性監(jiān)視器監(jiān)控和響應(yīng)屬性值的變化,每次屬性被設(shè)置值的時(shí)候都會(huì)調(diào)用屬性監(jiān)視器,甚至新的值和現(xiàn)在的值相同的時(shí)候也不例外。
可以為除了延遲存儲(chǔ)屬性之外的其他存儲(chǔ)屬性添加屬性監(jiān)視器,也可以通過重載屬性的方式為繼承的屬性(包括存儲(chǔ)屬性和計(jì)算屬性)添加屬性監(jiān)視器。屬性重載請(qǐng)參考繼承一章的重載。
注意:
不需要為無法重載的計(jì)算屬性添加屬性監(jiān)視器,因?yàn)榭梢酝ㄟ^ setter 直接監(jiān)控和響應(yīng)值的變化。
可以為屬性添加如下的一個(gè)或全部監(jiān)視器:
willSet在設(shè)置新的值之前調(diào)用didSet在新的值被設(shè)置之后立即調(diào)用
willSet監(jiān)視器會(huì)將新的屬性值作為固定參數(shù)傳入,在willSet的實(shí)現(xiàn)代碼中可以為這個(gè)參數(shù)指定一個(gè)名稱,如果不指定則參數(shù)仍然可用,這時(shí)使用默認(rèn)名稱newValue表示。
類似地,didSet監(jiān)視器會(huì)將舊的屬性值作為參數(shù)傳入,可以為該參數(shù)命名或者使用默認(rèn)參數(shù)名oldValue。
<<<<<<< HEAD
注意:
willSet和didSet監(jiān)視器在屬性初始化過程中不會(huì)被調(diào)用,他們只會(huì)當(dāng)屬性的值在初始化之外的地方被設(shè)置時(shí)被調(diào)用。注意:
willSet和didSet監(jiān)視器在屬性初始化過程中不會(huì)被調(diào)用,它們只會(huì)當(dāng)屬性的值在初始化之外的地方被設(shè)置時(shí)被調(diào)用。a516af6a531a104ec88da0d236ecf389a5ec72af
這里是一個(gè)willSet和didSet的實(shí)際例子,其中定義了一個(gè)名為StepCounter的類,用來統(tǒng)計(jì)當(dāng)人步行時(shí)的總步數(shù),可以跟計(jì)步器或其他日常鍛煉的統(tǒng)計(jì)裝置的輸入數(shù)據(jù)配合使用。
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類定義了一個(gè)Int類型的屬性totalSteps,它是一個(gè)存儲(chǔ)屬性,包含willSet和didSet監(jiān)視器。
當(dāng)totalSteps設(shè)置新值的時(shí)候,它的willSet和didSet監(jiān)視器都會(huì)被調(diào)用,甚至當(dāng)新的值和現(xiàn)在的值完全相同也會(huì)調(diào)用。
例子中的willSet監(jiān)視器將表示新值的參數(shù)自定義為newTotalSteps,這個(gè)監(jiān)視器只是簡(jiǎn)單的將新的值輸出。
didSet監(jiān)視器在totalSteps的值改變后被調(diào)用,它把新的值和舊的值進(jìn)行對(duì)比,如果總的步數(shù)增加了,就輸出一個(gè)消息表示增加了多少步。didSet沒有提供自定義名稱,所以默認(rèn)值oldValue表示舊值的參數(shù)名。
注意:
如果在didSet監(jiān)視器里為屬性賦值,這個(gè)值會(huì)替換監(jiān)視器之前設(shè)置的值。