didSet方法不调用的时机

有时候,既希望开放属性的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

我们想既开放iset方法,又对赋给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方法。

你可能感兴趣的:(didSet方法不调用的时机)