【问题标题】:RxSwift extending Observable generic type issueRxSwift 扩展 Observable 泛型类型问题
【发布时间】:2017-01-10 15:01:04
【问题描述】:

我在编写一些 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&lt;Bool&gt;.combineLatest 编译它。但是every 函数只能用Observable&lt;Bool&gt; 调用,如下所示。

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

如何将其更改为使用Observable.every 而不是Observable&lt;Bool&gt;.every,就像我使用Observable.combineLatest 时一样?

【问题讨论】:

    标签: swift generics reactive-programming observable


    【解决方案1】:

    你不见了&lt;Bool&gt;

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

    【讨论】:

    • 感谢您的回答,但如何将其提供给Observable.every 而不是Observable&lt;Bool&gt;.every
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    相关资源
    最近更新 更多