【问题标题】:RxSwift - behavior of subscribe(observer:)RxSwift - 订阅行为(观察者:)
【发布时间】:2018-08-22 07:50:29
【问题描述】:

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

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。
如果直接订阅映射的 observable,不会报错。
如#3所示,映射后的observable1的返回值为Observable。

期待回复。

【问题讨论】:

    标签: ios swift rx-swift


    【解决方案1】:

    这是因为.map { $0 }在第四种情况下实际上返回了Observable&lt;String?&gt;

    ww 可以将返回值强制转换为Observable&lt;String&gt;

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

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

    编译器看到你正在调用subscribe(Observable&lt;String?&gt;),并推断map的返回类型为Observable&lt;String?&gt;,因为只有这样才能成功调用subscribe

    但是如果你没有给编译器足够的上下文来确定map 应该返回的类型,就像你在let observable2 = ... 行中所做的那样,那么编译器会认为你想要一个Observable&lt;String&gt;

    基本上,编译器很聪明。

    【讨论】:

    • 非常感谢!我明白了。即使在使用方法链接的情况下,编译器也会正确推断类型。 swift 编译器制作精良,不是吗?
    • @zico 如果您认为我的回答回答了您的问题,请考虑通过单击该复选标记接受它!
    • 哦...我不知道这个功能。对不起!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    相关资源
    最近更新 更多