【发布时间】:2014-10-22 14:12:15
【问题描述】:
如果我将属性值设置为与当前设置相同的值,将调用 willSet 和 didSet 吗?了解这些函数何时出现副作用很重要。
【问题讨论】:
标签: swift
如果我将属性值设置为与当前设置相同的值,将调用 willSet 和 didSet 吗?了解这些函数何时出现副作用很重要。
【问题讨论】:
标签: swift
是的,即使设置为相同的值,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"}
【讨论】:
是的,确实如此。你可能有一个不符合 Equatable 协议的类型的属性,然后“相同的值”就没有意义了。 willSet 和 didSet 仅在初始化器中设置值时才被调用。
【讨论】: