gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 01:56:54 24 4
gpt4 key购买 nike

我对 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。

我期待着回复。

最佳答案

这是因为.map { $0 }实际上返回一个 Observable<String?>第四种情况!

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

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

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

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

但是如果你没有给编译器足够的上下文来找出 map 的类型应该返回,就像您在 let observable2 = ... 中所做的那样行,然后编译器认为你想要一个 Observable<String> .

基本上,编译器很聪明。

关于ios - RxSwift - 订阅行为(观察者 :),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51962140/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com