屬性監(jiān)聽器
- 1> 和計算屬性的set方法中的newValue一樣蛛倦,默認(rèn)情況下載willSet和didSet中會有一個newValue和oldValue參數(shù)表示要設(shè)置的新值和已經(jīng)被修改過的舊值(當(dāng)然參數(shù)名同樣可以自定義)
- 2> 存儲屬性的默認(rèn)值設(shè)置不會引起屬性監(jiān)視器的調(diào)用(另外在構(gòu)造方法中賦值也不會引起屬性監(jiān)視器調(diào)用),只有在外部設(shè)置存儲屬性才會引起屬性監(jiān)視器調(diào)用
- 3> 存儲屬性的屬性監(jiān)視器willSet砾医、didSet內(nèi)可以直接訪問屬性,但是在計算屬性的get方法中不能直接訪問計算屬性,否則會引起循環(huán)調(diào)用
- 4> 在didSet中可以修改屬性的值,這個值將作為最終值
- 5> 注意:newValue可以使用自定義值,并且在屬性監(jiān)視器內(nèi)部調(diào)用屬性不會引起監(jiān)視器循環(huán)調(diào)用,注意此時修改avarageScore的值沒有用
- 注意:oldValue可以使用自定義值,并且在屬性監(jiān)視器內(nèi)部調(diào)用屬性不會引起監(jiān)視器循環(huán)調(diào)用踩娘,注意此時修改avarageScore的值將作為最終結(jié)果
class Person {
//1.存儲屬性
var mathScore :Double = 0.0
var chineseScore : Double = 0.0
//最終成績, 存儲屬性
private var score: Double = 0.0
init(x : Double){
avarageScore = x
}
init() {
}
var avarageScore : Double = 0 {
willSet {
//newValue
avarageScore = 2.0
print("avarageScore即將發(fā)生改變 newValue = \(newValue), value = \(avarageScore)")
}
didSet {
//oldValue
avarageScore = 3.0
print("avarageScore已經(jīng)發(fā)生改變 oldValue = \(oldValue), value = \(avarageScore)")
}
}
}
let p = Person()
/*
//監(jiān)聽不到 存儲屬性
print("------")
print("默認(rèn)值:\(p.avarageScore)")
p.avarageScore = 11
print("最終平均值結(jié)果 \(p.avarageScore)")
*/
//構(gòu)造方法中賦值不會引起屬性監(jiān)視器調(diào)用
let p2 = Person(x: 11.1)
print(p.avarageScore)