2017-01-10 79 views
1

我在編寫一些RxSwift實用程序函數時遇到了問題。我想創建一個效用函數將多個Observable<Bool>流映射到單個Observable<Bool>流,該流將檢查每個源流是否爲true。它可以通過下面的代碼來實現。RxSwift擴展可觀察的泛型類型問題

var v1 = Variable<Bool>(true) 
var v2 = Variable<Bool>(false) 

Observable.combineLatest(v1.asObservable(), v2.asObservable()) { (a, b) -> Bool in 
    return a && b 
    } 
    .distinctUntilChanged() 
    .subscribe(onNext: { v in 
     print(">> \(v)") 
    }) 

v1.value = true 

// will print 
// >> false 
// >> true 

所以我寫了下面的代碼。

但它不會編譯錯誤Declared closure result 'Bool' is incompatible with contextual type '_'。試圖修復,但無法修復。

泛型類型系統可能出了問題,但我無法弄清楚。幫助將不勝感激。

====

編輯

由於@TomaszPikć回答,我可以把它編譯使用Observable<Bool>.combineLatest。但every函數只能用Observable<Bool>調用,如下所示。

Observable<Bool>.every(r1.asObservable(), r2.asObservable()) 
    .subscribe(onNext: { (e:Bool) in 
     print(">> \(e)") 
    }) 

我怎樣才能改變它使用Observable.every,而不是像Observable<Bool>.every當我使用Observable.combineLatest

回答

0

你缺少<Bool>

extension Observable { 
    static func every(_ s1: Observable<Bool>, _ s2: Observable<Bool>) -> Observable<Bool> { 
    return Observable<Bool>.combineLatest(s1, s2) { $0 && $1 } 
    } 
} 
+0

謝謝回答,但如何能使其可用於'Observable.every'代替'可觀察 .every'? – redism