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

问题描述 投票:1回答:2

我在了解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”是什么意思?

swift3 type-erasure rx-swift
2个回答
1
投票

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

实质上,这类似于Strings与CustomStringConvertible的一致性。


0
投票

你问了两个问题:

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是半正确的。我的意思是肯定会让人感到困惑。您可以将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>类型的操作数

© www.soinside.com 2019 - 2024. All rights reserved.