我想在代码中实现以下目标:
class MyService {
let mySubject = BehaviorSubject<MyData>(value: nil)
//....
}
不幸的是,我收到“无要求上下文类型”错误。我希望这个主题是“空的”,直到我实际在其中放了东西。那我如何传递nil作为参数呢?我可以将其转换为自己的类型以使其正常工作吗?
答案 0 :(得分:9)
基于reference for RxSwift BehaviorSubject
,init(value:)
初始化程序声明为
public init(value: Element)
其中value
参数描述为:
value
没有收到其他值时发送给观察者的初始值 依主题而定。
其中Element
是BehaviorSubject
的占位符类型:
public final class BehaviorSubject<Element> ...
这意味着如果要将初始值(未收到其他值时使用)设置为{{1,则需要将占位符类型Element
指定为Optional
类型。 }}。例如:
nil
或者,让编译器通过对class MyService {
let mySubject = BehaviorSubject<MyData?>(value: nil)
//....
}
参数使用非模糊的MyData?
形式将占位符推断为.none
:
nil
为更好地理解实际错误消息,请考虑以下独立示例:
class MyService {
let mySubject = BehaviorSubject(value: Optional<MyData>.none)
//....
}
答案 1 :(得分:1)
虽然@dfri的答案在技术上是正确的,但在使用RxSwift时,您可能需要考虑其他类型。由于您希望主题仅在开始时为空,因此建议使用ReplaySubject
或PublishSubject
。
在RxSwift的Github问题页面上也提出了类似的问题。 Allow BehaviorSubject without initial value。在那里,kzaher建议使用ReplaySubject
。
您的主题将看起来像这样,没有任何初始值,并且MyData不为Optional
。
let subject = ReplaySubject<MyData>().create(bufferSize: 1)