免責聲明RxSwift可觀察過濾器:我是半的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
一次性不照顧。理想情況下,我想將處置責任轉交給回報價值,但我可以將處置者作爲參數。我不在乎。
更大的問題是在最後測試行的編譯器異議:
使用「RxFilterableType」作爲具體類型符合協議「RxFilterableType」不支持
這意味着,我恐怕,編譯器沒有足夠的信息來推斷我想做什麼,儘管我已經絕望地嘗試幫助這個可憐的傢伙增加了超過必要的提示。
所以你試圖讓一個操作符來做到這一點? 'observable.filter {$ 0是A} .map {$ 0 as! A}' –