init时swift触发器didSet

时间:2016-05-25 10:28:44

标签: swift init didset

为什么这段代码会在init

时触发didSet
final 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',我想。

2 个答案:

答案 0 :(得分:1)

当您使用隐式解包的可选类型(在您的情况下为Bool!)声明属性时,会隐式分配默认值nil。然后,如果在初始化程序中为其分配了一些其他值,则didSet观察者会被触发,因为它已经是第二个赋值。 didSet不应该仅在第一个上被触发。

答案 1 :(得分:-2)

每次为属性分配新值时,didSet{}闭包被称为(即使您在声明(内联)或初始化时分配它)。