RxSwift扩展了Observable泛型类型问题

时间:2017-01-10 15:01:05

标签: swift generics reactive-programming observable

我在编写一些RxSwift实用程序函数时遇到了麻烦。我想创建一个实用程序函数,将多个Observable<Bool>流映射到单个Observable<Bool>流,检查每个源流是否为true。它可以通过以下代码实现。

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

所以我写了下面的代码。

import RxSwift

extension Observable {
    public static func every(_ s1: Observable<Bool>, _ s2: Observable<Bool>) -> Observable<Bool> {
        return Observable.combineLatest(s1, s2) { (a, b) -> Bool in
            return a && b
        }
    }
}

但它不会编译错误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时一样?

1 个答案:

答案 0 :(得分:0)

您缺少<Bool>

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