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:)初始化程序声明为
Run Code Online (Sandbox Code Playgroud)public init(value: Element)
当value参数描述为:
value当主体尚未收到其他值时发送给观察者的初始值.
Element占位符类型在哪里BehaviorSubject:
Run Code Online (Sandbox Code Playgroud)public final class BehaviorSubject<Element> ...
这意味着如果要能够设置初始值(在没有收到其他值时使用),则需要将占位符类型指定Element为Optional类型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)
| 归档时间: |
|
| 查看次数: |
7935 次 |
| 最近记录: |