我在编写一些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 '_'。试图修复,但无法修复。
可能是泛型类型系统出了问题,但我想不通。非常感谢您的帮助。
====
编辑
正如@Tomasz Pikć所回答的,我可以使用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那样?

最佳答案

你失踪了<Bool>

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

关于swift - RxSwift扩展了Observable泛型类型问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41571853/

10-12 07:37
查看更多