コードで次のことを達成したいと思います。
class MyService {
let mySubject = BehaviorSubject<MyData>(value: nil)
//....
}
残念ながら、「nilにはコンテキストタイプが必要です」というエラーが表示されます。実際に何かを入れるまで、その件名は「空」にしておく必要があります。では、引数としてnilを渡すにはどうすればよいですか?自分のタイプにキャストして機能させることはできますか?
RxSwift BehaviorSubject
の参照 に基づいて、init(value:)
初期化子は次のように宣言されます
public init(value: Element)
value
パラメータは次のように記述されます。
value
サブジェクトが他の値をまだ受け取っていないときにオブザーバーに送信される初期値。
また、Element
はBehaviorSubject
のプレースホルダータイプです。
public final class BehaviorSubject<Element> ...
つまり、(他の値が受信されていないときに使用される)初期値をElement
に設定できるようにする場合は、プレースホルダータイプOptional
をnil
タイプとして指定する必要があります。例えば。:
class MyService {
let mySubject = BehaviorSubject<MyData?>(value: nil)
//....
}
または、nil
引数に砂糖なしのMyData?
形式を使用して、プレースホルダーを.none
としてコンパイラーに推測させます。
class MyService {
let mySubject = BehaviorSubject(value: Optional<MyData>.none)
//....
}
実際のエラーメッセージをよりよく理解するには、次の自己完結型の例を検討してください。
struct Foo<T> {
init(value: T) {}
}
struct Bar {}
let bar = Bar()
_ = Foo<Bar>(value: bar) // OK
_ = Foo(value: bar) // OK, T inferred as Bar
_ = Foo<Bar>(value: nil) // Error: error: 'nil' requires a contextual type
_ = Foo<Bar?>(value: nil) // OK
_ = Foo(value: Optional<Bar>.none) // OK, T inferred as Bar?
@dfriの答えは技術的に正しいですが、RxSwiftを使用する場合は別のタイプを検討することをお勧めします。最初は件名を空にしたいので、ReplaySubject
またはPublishSubject
を使用することをお勧めします。
同様の質問がRxSwiftのGithub問題ページでも行われています。 初期値なしでBehaviorSubjectを許可 。そこで、kzaherがReplaySubject
を提案します。
これで、サブジェクトは次のようになります。初期値はなく、MyDataはOptional
ではありません。
let subject = ReplaySubject<MyData>().create(bufferSize: 1)