首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RxSwift -订阅行为(观察者:)

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

Stack Overflow用户
提问于 2018-08-22 07:50:29
回答 1查看 225关注 0票数 2

我对RxSwift中订阅方法的行为感到困惑。

这是示例代码。

代码语言:javascript
复制
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的返回值是可观察的。

我期待着答复。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-22 08:12:48

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

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

代码语言:javascript
复制
_ = (observable1.map{ $0 } as Observable<String>).subscribe(observer2)

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

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

但是,如果您没有给编译器提供足够的上下文来计算map应该返回的类型,就像在let observable2 = ...行中所做的那样,那么编译器就会认为您需要一个Observable<String>

基本上,编译器是聪明的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51962140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档