1

( ReactiveCocoa4 または多分 3 に適用)

私が見たほとんどの例とケースでは、またはReactiveCocoaのようなオブジェクトは、ユーザー インターフェイスをデータに接続することに関与しており、コンストラクターで呼び出される何らかのメソッドまたは類似のメソッドで少なくともインスタンス化されています。MutableProperty<TVal, TErr>SignalProducer<TVal, TErr>setupBindings

オブジェクトの宣言をスコープから保存されたプロパティに、またはその逆に移動したときに、突然「機能した」コードが機能しないというケースをいくつか経験しました。たとえば、擬似コードでは次のようになります。

class Wtf {

    // doesn't work

    init() {
        let prop = MutableProperty<Dah, Dah>()...
        doSomethingWith(prop)
    }

    // also doesn't work

    private let prop: MutableProperty<Dah, Dah> = MutableProperty<Dah, Dah>(Dah())

    init() {
        doSomethingWith(prop)
    }    

    // works?

    private let prop: MutableProperty<Dah, Dah>

    init() {
        prop = MutableProperty<Dah, Dah>(Dah())
        doSomethingWith(prop)
    }
}

そのため、いくつかの基本的な質問があるようです。

与えられたReactiveCocoaオブジェクト...

  1. プロパティ (または) とローカル インスタンス変数として宣言する必要があるのはいつですか?letvar
  2. プロパティとインスタンスのストアド、計算、またはその他のバリアントとしてインスタンス化する必要があるのはいつですか
  3. いつ関数にする必要がありますreturnか?
4

1 に答える 1

0

MutablePropertyですclass。つまり、参照セマンティクスがあります。Signal(その寿命は終了イベントに依存する)とは異なり、 aの寿命はproperty所有者によって定義されます。プロパティへの参照を保持しているオブジェクトがない場合は、割り当てが解除されます。

そのため、あなたの質問への答えは通常、別のクラスの中に保存することです。

行う一般的なことは、を保持しMutableProperty private、読み取り可能なもののみを公開することです。

final class Owner {
    private let mutableProperty = MutableProperty<Type?>(nil)
    public var property: AnyProperty<Type?> {
        return AnyProperty(self.mutableProperty)
    }
}
于 2015-12-05T02:02:29.450 に答える