Swift:RxSwift的asObservable()方法和类型擦除

时间:2017-02-02 12:20:36

标签: swift3 type-erasure rx-swift

我在理解RxSwift asObservable methodObservable 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”是什么意思?

3 个答案:

答案 0 :(得分:1)

我相信如果你看一下ObservableType协议以及哪些对象符合它(即主题等内容),答案就很明显了。 唯一的保证是对象将返回Observable以响应对asObservable的调用。虽然Observable的一致性是微不足道的,但对于主题和其他单位来说可能不那么一致。但是,此保证允许您使用可在同一运算符链中一起提供Observable的所有类型。

实质上,这类似于StringCustomStringConvertible的一致性。

答案 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是半正确的。我的意思是肯定令人困惑。您可以将BehvaiorRelayPublishSubject的类型展平为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 的运算符方便地对抗中继或主体。