【问题标题】:Does setting the same value for a property still call willSet and didSet?为属性设置相同的值是否仍会调用 willSet 和 didSet?
【发布时间】:2014-10-22 14:12:15
【问题描述】:

如果我将属性值设置为与当前设置相同的值,将调用 willSet 和 didSet 吗?了解这些函数何时出现副作用很重要。

【问题讨论】:

    标签: swift


    【解决方案1】:

    是的,即使设置为相同的值,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"}
    

    如果您想防止在设置相同值时发生副作用,可以将值与 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"}
    

    【讨论】:

      【解决方案2】:

      是的,确实如此。你可能有一个不符合 Equatable 协议的类型的属性,然后“相同的值”就没有意义了。 willSetdidSet 仅在初始化器中设置值时才被调用。

      【讨论】:

        猜你喜欢
        • 2016-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-12
        • 2019-12-20
        • 2014-07-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多