为属性设置相同的值仍然会调用willSet和didSet吗?

Ric*_*ble 11 swift

如果我将属性值设置为与当前设置的值相同的值,是否会调用willSet和didSet?了解何时在这些功能中发生副作用非常重要.

Ric*_*ble 15

是的,即使设置为相同的值,也会调用willSet和didSet.我在操场上测试过:

class Class1 {
    var willSetCount = 0
    var didSetCount = 0
    var var1: String = "A" {
        willSet {
            willSetCount++
        }
        didSet {
            didSetCount++
        }
    }
}

let aClass1 = Class1()  // {0 0 "A"}
aClass1.var1 = "A"      // {1 1 "A"}
aClass1.var1 = "A"      // {2 2 "A"}
Run Code Online (Sandbox Code Playgroud)

如果要在设置相同值时防止发生副作用,可以将值与newValue/oldValue进行比较:

class Class2 {
    var willSetCount = 0
    var didSetCount = 0
    var var1: String = "A" {
        willSet {
            if newValue != var1 {
                willSetCount++
            }
        }
        didSet {
            if oldValue != var1 {
                didSetCount++
            }
        }
    }
}

let aClass2 = Class2()  // {0 0 "A"}
aClass2.var1 = "A"      // {0 0 "A"}
aClass2.var1 = "B"      // {1 1 "B"}
Run Code Online (Sandbox Code Playgroud)


Mar*_*rný 7

是的,它确实.你可能有一个不符合Equatable协议的类型的属性,然后"相同的值"没有意义.willSet并且didSet仅在初始化程序内设置值时才调用.