为什么这段代码会在init
时触发didSetfinal public class TestDidSet {
static var _shared: TestDidSet! = TestDidSet()
func testA() { }
private var test = true {
didSet {
print("didSet test when initing!!!!!:\(test)")
}
}
private var _value: Bool! {
didSet {
print("didSet when initing!!!!!:\(_value)")
}
}
private init() {
testSet()
_value = false
test = false
}
private func testSet() {
_value = true
}
}
TestDidSet._shared.testA()
任何想法? 它不应该触发didSet吗? 有人帮忙!
更新:
我的观点是这样的,
testSet()
和_value = false
正在执行相同的操作,但testSet()
在init()
之外,因此testSet()
会触发didSet
_value = false
不。为什么呢?!
这不是可选类型或其他原因,导致'didSet',我想。
答案 0 :(得分:1)
当您使用隐式解包的可选类型(在您的情况下为Bool!
)声明属性时,会隐式分配默认值nil
。然后,如果在初始化程序中为其分配了一些其他值,则didSet
观察者会被触发,因为它已经是第二个赋值。 didSet
不应该仅在第一个上被触发。
答案 1 :(得分:-2)
每次为属性分配新值时,didSet{}
闭包被称为(即使您在声明(内联)或初始化时分配它)。