有时候,既希望开放属性的set方法,又想对属性的值进行限制。例如:
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) //结果为为2
我们想既开放i
的set
方法,又对赋给i的值进行了限制,保证i
的值必须为偶数。这里我们用到了didSet
方法,在set
方法调用后,对i
的值进行调整。最终结果是符合预期的需求,但这里似乎存在一个问题。
var i: Int {
didSet {
if i % 2 != 0 {
i = i - 1 //注意这行,这里调用了set方法
}
}
}
实际上,在didSet
方法中调用set
方法,是不会再次出发didSet
方法的。这样我们就不用担心死循环的问题了。
下面我们把代码改一下:
class A {
var i: Int {
didSet {
if i % 2 != 0 {
i = i - 1
}
}
}
init(i: Int) {
self.i = i
}
}
//以下代码进行了改动
let a = A(i: 1) //这里i的初值改成了1
print(a.i) //结果为1
a.i = 3
print(a.i) //结果为为2
我们发现, 在初始化方法中,
self.i = i
这行代码是调用了set
方法的,但也没有出发didSet
方法,可见,初始化时赋值也不会触发didSet
方法。
总结
初始化和didSet方法内部调用set方法,不会触发didSet
方法。