免责声明:我是一个半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)
}
Run Code Online (Sandbox Code Playgroud)
这有两个问题:较小的问题是内部subscribe一次性用品没有得到照顾.理想情况下,我想将处置责任转移到返回值上,但我可以将处理器作为参数.我不在乎.
更大的问题是最后一个测试行上的编译器异议:
不支持使用'RxFilterableType'作为符合协议'RxFilterableType'的具体类型
这意味着,我担心,编译器没有足够的信息来推断我正在尝试做什么,尽管我已经添加了绝望的尝试来帮助这个可怜的家伙.
如果你把它放在一个配置为使用RxSwift的游乐场,它将工作:
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) })
Run Code Online (Sandbox Code Playgroud)
或者,如果您不喜欢指定以下类型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) })
Run Code Online (Sandbox Code Playgroud)
要求类类型作为参数是你的一个很好的接触.我没想过这样做.
| 归档时间: |
|
| 查看次数: |
1260 次 |
| 最近记录: |