Swift:nil需要一个上下文类型

bre*_*ine 4 xcode ios swift rx-swift

我想在代码中实现以下功能:

class MyService {

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

    //....

}
Run Code Online (Sandbox Code Playgroud)

不幸的是我得到"nil需要上下文类型"错误.我希望这个主题是"空的",直到我真正把东西放在那里.那么如何通过nil作为参数呢?我可以将它投射到我自己的类型以使其工作吗?

dfr*_*fri 11

根据RxSwiftBehaviorSubject引用,init(value:)初始化程序声明为

public init(value: Element)
Run Code Online (Sandbox Code Playgroud)

value参数描述为:

value

当主体尚未收到其他值时发送给观察者的初始值.

Element占位符类型在哪里BehaviorSubject:

public final class BehaviorSubject<Element> ...
Run Code Online (Sandbox Code Playgroud)

这意味着如果要能够设置初始值(在没有收到其他值时使用),则需要将占位符类型指定ElementOptional类型nil.例如:

class MyService {

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

    //....
}
Run Code Online (Sandbox Code Playgroud)

或者,让编译器MyData?通过使用参数的非糖.none形式来推断占位符nil:

class MyService {

    let mySubject = BehaviorSubject(value: Optional<MyData>.none)

    //....
}
Run Code Online (Sandbox Code Playgroud)

至于更好地理解实际错误消息,请考虑以下自包含示例:

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?
Run Code Online (Sandbox Code Playgroud)