有時(shí)候,既希望開(kāi)放屬性的set方法西雀,又想對(duì)屬性的值進(jìn)行限制歉摧。例如:
class A {
var i: Int {
didSet {
if i % 2 != 0 {
i = i - 1
}
}
}
init(i: Int) {
self.i = i
}
}
let a = A(i: 0)
a.i = 3
print(a.i) //結(jié)果為為2
我們想既開(kāi)放i
的set
方法,又對(duì)賦給i的值進(jìn)行了限制再悼,保證i
的值必須為偶數(shù)膝但。這里我們用到了didSet
方法,在set
方法調(diào)用后跟束,對(duì)i
的值進(jìn)行調(diào)整丑孩。最終結(jié)果是符合預(yù)期的需求温学,但這里似乎存在一個(gè)問(wèn)題甚疟。
var i: Int {
didSet {
if i % 2 != 0 {
i = i - 1 //注意這行,這里調(diào)用了set方法
}
}
}
實(shí)際上箩帚,在didSet
方法中調(diào)用set
方法黄痪,是不會(huì)再次出發(fā)didSet
方法的桅打。這樣我們就不用擔(dān)心死循環(huán)的問(wèn)題了。
下面我們把代碼改一下:
class A {
var i: Int {
didSet {
if i % 2 != 0 {
i = i - 1
}
}
}
init(i: Int) {
self.i = i
}
}
//以下代碼進(jìn)行了改動(dòng)
let a = A(i: 1) //這里i的初值改成了1
print(a.i) //結(jié)果為1
a.i = 3
print(a.i) //結(jié)果為為2
我們發(fā)現(xiàn)挺尾, 在初始化方法中遭铺,
self.i = i
這行代碼是調(diào)用了set
方法的,但也沒(méi)有出發(fā)didSet
方法魂挂,可見(jiàn)馁筐,初始化時(shí)賦值也不會(huì)觸發(fā)didSet
方法。
總結(jié)
初始化和didSet方法內(nèi)部調(diào)用set方法果正,不會(huì)觸發(fā)didSet
方法盟迟。