我对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都有错误。
因为观察者是可空字符串类型,所以它与可观察到的字符串类型完全不同。
但我不明白第四条。
如果直接订阅映射的可观测性,则不会得到错误。
如#3所示,映射的observable1的返回值是可观察的。
我期待着答复。
发布于 2018-08-22 08:12:48
这是因为.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 = ...行中所做的那样,那么编译器就会认为您需要一个Observable<String>。
基本上,编译器是聪明的。
https://stackoverflow.com/questions/51962140
复制相似问题