带铸造的 RxSwift Observable 过滤器
RxSwift Observable filter with casting
免责声明:我是半个 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
disposable 没有得到处理。理想情况下,我想将处理责任传递给 return 值,但我可以将处理程序作为参数。我不在乎。
更大的问题是编译器对最后一行的反对:
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 { [=10=] is T }.map { [=10=] 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([=10=]) })
或者如果您不喜欢指定 casted
的类型:
extension ObservableType {
func filterByCast<T>(_ class: T.Type) -> Observable<T> {
return self.filter { [=11=] is T }.map { [=11=] 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([=11=]) })
需要 class 类型作为参数是您的一个很好的做法。我没想过要那样做。
免责声明:我是半个 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
disposable 没有得到处理。理想情况下,我想将处理责任传递给 return 值,但我可以将处理程序作为参数。我不在乎。
更大的问题是编译器对最后一行的反对:
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 { [=10=] is T }.map { [=10=] 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([=10=]) })
或者如果您不喜欢指定 casted
的类型:
extension ObservableType {
func filterByCast<T>(_ class: T.Type) -> Observable<T> {
return self.filter { [=11=] is T }.map { [=11=] 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([=11=]) })
需要 class 类型作为参数是您的一个很好的做法。我没想过要那样做。