我在编写一些 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
就像我使用 Observable.combineLatest
时一样?
最佳答案
你错过了<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/