RxSwift - subscribe(observer:) 的行为
RxSwift - behavior of subscribe(observer:)
我对 RxSwift 中订阅方法的行为感到困惑。
这是示例代码。
let observer1 = PublishSubject<String>()
let observer2 = PublishSubject<String?>()
let observable1 = Observable.just("")
let observable2 = observable1.map { [=10=] }
_ = observable1.subscribe(observer1) // #1. OK
_ = observable1.subscribe(observer2) // #2. Error
_ = observable2.subscribe(observer2) // #3. Error
_ = observable1.map{ [=10=] }.subscribe(observer2) // #4. OK
我知道 #2 和 #3 出错了。
因为观察者是可空字符串类型,所以它与可观察者持有的类型完全不同。
但是我看不懂#4.
如果直接订阅映射的可观察对象,则不会出错。
如 #3 所示,映射的 observable1 的 return 值是 Observable.
期待回复
这是因为.map { [=11=] }
实际上return是第4种情况下的Observable<String?>
!
Ww 可以将 return 值转换为 Observable<String>
:
_ = (observable1.map{ [=10=] } as Observable<String>).subscribe(observer2)
它停止工作了!这意味着 return 由 map
编辑而没有转换的值必须不同。而且只有一种可能——Observable<String?>
。 [=16=]
不能隐式转换为其他类型。
编译器看到你在调用subscribe(Observable<String?>)
并推断map
的return类型为Observable<String?>
因为只有这样才能调用subscribe
成功。
但是如果你没有给编译器足够的上下文来找出 map
应该 return 的类型,就像你在 let observable2 = ...
行中所做的那样,那么编译器会认为你想要 Observable<String>
.
基本上,编译器很聪明。
我对 RxSwift 中订阅方法的行为感到困惑。
这是示例代码。
let observer1 = PublishSubject<String>()
let observer2 = PublishSubject<String?>()
let observable1 = Observable.just("")
let observable2 = observable1.map { [=10=] }
_ = observable1.subscribe(observer1) // #1. OK
_ = observable1.subscribe(observer2) // #2. Error
_ = observable2.subscribe(observer2) // #3. Error
_ = observable1.map{ [=10=] }.subscribe(observer2) // #4. OK
我知道 #2 和 #3 出错了。
因为观察者是可空字符串类型,所以它与可观察者持有的类型完全不同。
但是我看不懂#4.
如果直接订阅映射的可观察对象,则不会出错。
如 #3 所示,映射的 observable1 的 return 值是 Observable.
期待回复
这是因为.map { [=11=] }
实际上return是第4种情况下的Observable<String?>
!
Ww 可以将 return 值转换为 Observable<String>
:
_ = (observable1.map{ [=10=] } as Observable<String>).subscribe(observer2)
它停止工作了!这意味着 return 由 map
编辑而没有转换的值必须不同。而且只有一种可能——Observable<String?>
。 [=16=]
不能隐式转换为其他类型。
编译器看到你在调用subscribe(Observable<String?>)
并推断map
的return类型为Observable<String?>
因为只有这样才能调用subscribe
成功。
但是如果你没有给编译器足够的上下文来找出 map
应该 return 的类型,就像你在 let observable2 = ...
行中所做的那样,那么编译器会认为你想要 Observable<String>
.
基本上,编译器很聪明。