如果我将属性值设置为与当前设置的值相同的值,是否会调用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)
归档时间: |
|
查看次数: |
2930 次 |
最近记录: |