2017-04-25 75 views
0

免責聲明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」不支持

這意味着,我恐怕,編譯器沒有足夠的信息來推斷我想做什麼,儘管我已經絕望地嘗試幫助這個可憐的傢伙增加了超過必要的提示。

+0

所以你試圖讓一個操作符來做到這一點? 'observable.filter {$ 0是A} .map {$ 0 as! A}' –

回答

4

如果你把這個配置爲使用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) }) 

或者,如果你不喜歡的,指定的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) }) 

鍵入作爲參數是你的一個很好的接觸。我沒有想過這樣做。

+0

好吧,這完全有效。我不知道'ObservableType'有它自己的'map',它可以方便地準確地滿足我的需要。類類型作爲參數表現爲最方便的模式,因爲可觀察訂閱通常是直的匿名鏈,所以沒有可用於推斷的類型可觀察實例。 –