2

このコードが初期化時に 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」を引き起こすのは、オプションのタイプやその他の理由ではないと思います。

4

2 に答える 2

1

Bool!暗黙的にラップされていないオプションの型(あなたの場合)でプロパティを宣言すると、暗黙的にデフォルト値の が割り当てられますnil。その後、イニシャライザで他の値を割り当てると、didSetすでに2番目の割り当てであるため、オブザーバがトリガーされます。 didSet最初のものだけでトリガーされるべきではありません。

于 2016-05-25T10:55:26.730 に答える