我在理解RxSwift asObservable method中Observable class的基本原理和目的时遇到了问题。
/// A type-erased `ObservableType`.
///
/// It represents a push style sequence.
public class Observable<Element> : ObservableType {
/// Type of elements in sequence.
public typealias E = Element
public func subscribe<O: ObserverType>(_ observer: O) -> Disposable where O.E == E {
abstractMethod()
}
public func asObservable() -> Observable<E> {
return self
}
}
asObservable回归自我时的目的是什么?
当然,如果您可以运行此方法,则您已经可以访问该对象。此外,评论中的“类型删除ObservableType
”是什么意思?
答案 0 :(得分:1)
我相信如果你看一下ObservableType
协议以及哪些对象符合它(即主题等内容),答案就很明显了。
唯一的保证是对象将返回Observable
以响应对asObservable
的调用。虽然Observable
的一致性是微不足道的,但对于主题和其他单位来说可能不那么一致。但是,此保证允许您使用可在同一运算符链中一起提供Observable
的所有类型。
实质上,这类似于String
与CustomStringConvertible
的一致性。
答案 1 :(得分:0)
您问了两个问题:
1。返回自己时,asObservable的目的是什么?
您几乎不需要使用asObservable()
。我认为您唯一需要的时间是当您将演员/中继分配给可观察对象时。
假设您有一个BehaviorRelay
变量。它既可以观察也可以观察。
ViewModel.swift
let deviceOrientation = BehaviorRelay<UIInterfaceOrientation>(value: UIApplication.shared.statusBarOrientation)
然后您将得到一个变量,该变量不是两个,而是仅,如下所示。
ViewController.swift
lazy var incorrect : Observable<UIInterfaceOrientation> = {
return self.viewModel.deviceOrientation // ERROR
}()
lazy var correct : Observable<UIInterfaceOrientation> = {
return self.viewModel.deviceOrientation.asObservable()
}()
然后您需要广播,以便您具有正确的类型。
不正确的变量将产生以下错误:
无法转换类型
BehaviorRelay<UIInterfaceOrientation>
的值 到关闭结果类型Observable<UIInterfaceOrientation>
2。注释中的“类型擦除的ObservableType”是什么意思?
我怀疑Scott's comment是半正确的。我的意思是肯定令人困惑。您可以将BehvaiorRelay
,PublishSubject
的类型展平为Observable
,然后将一个Observable分配给另一个。否则,它们都要求提供associatedType,即没有类型擦除发生。
let x : AnyHashable = 10
let y : AnyHashable = "Alex"
if x == y { print("equal" } // compiles!
var i = PublishSubject<Int>().asObservable()
var s = PublishSubject<String>().asObservable()
if i == s { print("equal" } // does NOT compile. Gives following error:
二进制运算符
==
不能应用于类型为Observable<Int>
和Observable<String>
答案 2 :(得分:0)
asObservable 只是一个向下转换的运算符,用于为操作 Obserable 的运算符方便地对抗中继或主体。