RxSwift-订阅的行为(观察者:)

时间:2018-08-22 07:50:30

标签: ios swift rx-swift

我对RxSwift中订阅方法的行为感到困惑。
这是示例代码。

let observer1 = PublishSubject<String>()
let observer2 = PublishSubject<String?>()

let observable1 = Observable.just("")
let observable2 = observable1.map { $0 }

_ = observable1.subscribe(observer1) // #1. OK
_ = observable1.subscribe(observer2) // #2. Error
_ = observable2.subscribe(observer2) // #3. Error
_ = observable1.map{ $0 }.subscribe(observer2) // #4. OK

我知道#2和#3出现错误。
因为观察者是可为空的字符串类型,所以它与可观察者所持有的类型完全不同。

但是我听不懂#4。
如果直接订阅映射的可观察对象,则不会发生错误。
如#3所示,映射的observable1的返回值为Observable。

我期待答复。

1 个答案:

答案 0 :(得分:1)

这是因为在第四种情况下,.map { $0 }实际上返回了Observable<String?>

Ww可以将返回值转换为Observable<String>

_ = (observable1.map{ $0 } as Observable<String>).subscribe(observer2)

它停止工作!这意味着map返回的不带强制转换的值必须不同。而且只有一种可能性-Observable<String?>$0不能隐式转换为其他类型。

编译器会看到您正在调用subscribe(Observable<String?>)并推断map的返回类型为Observable<String?>,因为只有这样subscribe才能被成功调用。

但是,如果您没有给编译器足够的上下文来确定map应该返回的类型(就像您在let observable2 = ...行中所做的那样,那么编译器会认为您想要{{1 }}。

基本上,编译器很聪明。