swift - RxSwift 扩展 Observable 泛型问题

标签 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 '_' .试图修复,但无法修复。

可能泛型类型系统出了点问题,但我想不通。非常感谢您的帮助。

====

编辑

正如@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/

相关文章:

Swift - 如何更改 SCNNode 对象的枢轴

java - Java 类型删除会删除我的泛型类型吗?

具有有界通配符的 Java 泛型

reactive-programming - 主线程上的 Flux/Publisher

java - RXJava - 当其中之一的数据可用时永久切换可观察对象

swift - 您如何映射 Zip2 的值?

ios - UITableView 内容大小不正确

java - 管理泛型外部类及其内部泛型内部类实例化以及声明各自引用的规则是什么?

scala - 响应式(Reactive)编程和普通的旧闭包有什么区别?

ios - 为什么 UIViewController 的 'view' 属性在 Swift 中不是可选的?