1. ホーム
  2. アイオス

[解決済み】Swiftで初期化中にdidSetを呼び出せるようにすることは可能か?

2022-04-01 17:04:08

質問

質問

Appleのドキュメント と指定します。

willSet および didSet オブザーバは、プロパティが最初に初期化されたときには呼び出されません。それらは、プロパティの値が初期化コンテキストの外で設定されたときにのみ呼び出される。

これらを強制的に初期化時に呼び出すことは可能でしょうか?

なぜですか?

例えば、こんなクラスがあるとします。

class SomeClass {
    var someProperty: AnyObject {
        didSet {
            doStuff()
        }
    }

    init(someProperty: AnyObject) {
        self.someProperty = someProperty
        doStuff()
    }

    func doStuff() {
        // do stuff now that someProperty is set
    }
}

メソッドを作成しました。 doStuff の中にあるプロパティを処理するだけでよいのです。 didSet 関数を使用します。 これを初期化中に強制的に呼び出す方法はありますか?

更新情報

私のクラスでは、コンビニエンス・インティライザーを削除し、初期化後にプロパティを設定することを強制することにしました。 これによって、私は didSet が常に呼び出されます。 これが全体的に良いのかどうかはまだ決めていませんが、私の状況にはよく合っています。

どのように解決するのですか?

独自のset-Methodを作成し、init-Methodの中で使用します。

class SomeClass {
    var someProperty: AnyObject! {
        didSet {
            //do some Stuff
        }
    }

    init(someProperty: AnyObject) {
        setSomeProperty(someProperty)
    }

    func setSomeProperty(newValue:AnyObject) {
        self.someProperty = newValue
    }
}

を宣言することで someProperty を型とする。 AnyObject! (暗黙のうちに ラップされていないオプショナル)を使用する場合、self を完全に初期化するには someProperty が設定されています。を呼び出すと setSomeProperty(someProperty) と等価なものを呼び出していることになります。 self.setSomeProperty(someProperty) . 通常であれば これは self が完全に初期化されていないためです。というのも someProperty は初期化を必要としません。 メソッドが self に依存している場合、Swift は初期化コンテキストから抜け出し didSetが実行されます。