我对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。
我期待答复。
答案 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 }}。
基本上,编译器很聪明。