gpt4 book ai didi

swift3 - 带转换的 RxSwift Observable 过滤器

转载 作者:行者123 更新时间:2023-12-02 03:30:39 24 4
gpt4 key购买 nike

免责声明:我是一个半 Rx 新手,所以这个想法很可能完全是疯狂的:)

我正在尝试编写ObservableType过滤器,它只会传递特定类型,但会传递该类型,而不是原始序列类型。这是我到目前为止想到的:

extension ObservableType where Self.E: RxFilterableType {
func filterByCast<T: RxFilterableType>(class: T.Type) -> Observable<T> {
let retval = PublishSubject<T>()
self.subscribe { event in
switch event {
case .next(let element):
if let passed = element as? T {
retval.onNext(passed)
}
case .error(let error):
retval.onError(error)
case .completed:
retval.onCompleted()
}
}
return retval
}
}

func test() {
class A: RxFilterableType {}
class B: RxFilterableType {}

let array: [RxFilterableType] = [A(), B()]
let observable: Observable<RxFilterableType> = Observable.from(array)
let observableCasted: Observable<A> = observable.filterByCast(class: A.self)
}

这有两个问题:较小的问题是内部的 subscribe 一次性内容没有得到处理。理想情况下,我想将处理责任传递给返回值,但我可以将处理程序作为参数。我不在乎。

更大的问题是最后一个测试行的编译器反对:

Using 'RxFilterableType' as a concrete type conforming to protocol 'RxFilterableType' is not supported

这意味着,我担心编译器没有足够的信息来推断我正在尝试做什么,尽管我在拼命尝试帮助这个可怜的家伙时添加了多余的提示。

最佳答案

如果您将其放入配置为使用 RxSwift 的 Playground 中,它将起作用:

import RxSwift

extension ObservableType {
func filterByCast<T>() -> Observable<T> {
return self.filter { $0 is T }.map { $0 as! T }
}
}

protocol Foo { }
struct A: Foo { }
struct B: Foo { }

let array: [Foo] = [A(), B()]
let observable = Observable.from(array)
let casted: Observable<A> = observable.filterByCast()
_ = casted.subscribe(onNext: { print($0) })

或者,如果您不喜欢指定casted的类型:

extension ObservableType {
func filterByCast<T>(_ class: T.Type) -> Observable<T> {
return self.filter { $0 is T }.map { $0 as! T }
}
}

protocol Foo { }
struct A: Foo { }
struct B: Foo { }

let array: [Foo] = [A(), B()]
let observable = Observable.from(array)
let casted = observable.filterByCast(A.self)
_ = casted.subscribe(onNext: { print($0) })

要求类类型作为参数是你的一个很好的做法。我没想过这样做。

关于swift3 - 带转换的 RxSwift Observable 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43612211/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com