斯威夫特:零需要上下文类型

时间:2018-07-22 12:21:18

标签: ios swift xcode rx-swift

我想在代码中实现以下目标:

class MyService {

    let mySubject = BehaviorSubject<MyData>(value: nil)

    //....

}

不幸的是,我收到“无要求上下文类型”错误。我希望这个主题是“空的”,直到我实际在其中放了东西。那我如何传递nil作为参数呢?我可以将其转换为自己的类型以使其正常工作吗?

2 个答案:

答案 0 :(得分:9)

基于reference for RxSwift BehaviorSubjectinit(value:)初始化程序声明为

public init(value: Element)

其中value参数描述为:

  

value

     

没有收到其他值时发送给观察者的初始值   依主题而定。

其中ElementBehaviorSubject的占位符类型:

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时,您可能需要考虑其他类型。由于您希望主题仅在开始时为空,因此建议使用ReplaySubjectPublishSubject

在RxSwift的Github问题页面上也提出了类似的问题。 Allow BehaviorSubject without initial value。在那里,kzaher建议使用ReplaySubject

您的主题将看起来像这样,没有任何初始值,并且MyData不为Optional

let subject = ReplaySubject<MyData>().create(bufferSize: 1)