我在了解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
”是什么意思?
我相信如果你看一下ObservableType
协议以及哪些对象符合它(即主题之类的东西等),答案是显而易见的。唯一的保证是该对象将返回一个Observable
以响应对asObservable
的调用。虽然Observable
的一致性是微不足道的,但对于主题和其他单位来说可能不那么一致。但是这种保证允许您使用可以在同一运营商链中一起提供Observable
的所有类型。
实质上,这类似于String
s与CustomStringConvertible
的一致性。
你问了两个问题:
1.当它回归自我时,asObservable的目的是什么?
你几乎不需要使用asObservable()
。我认为你需要的唯一一次是你将一个主题/中继转换为一个Observable。
假设你有一个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>
类型的操作数