Swift 结合未知数量的可观测数据

Swift 结合未知数量的可观测数据,swift,generics,swift2,rx-swift,Swift,Generics,Swift2,Rx Swift,我正在使用RxSwift。我有一个文本字段数组,它依赖于哪个UI是可见的;数组中可能有1、3或4个文本字段 迭代数组,我为每个数组创建信号,将其映射到一个布尔值,指示字段是否有效 let textFields: [UITextField] = ... var signals: [Observable<Bool>] = [] textFields.forEach { tf in let sig = tf.rx_text .map { stri

我正在使用RxSwift。我有一个文本字段数组,它依赖于哪个UI是可见的;数组中可能有1、3或4个文本字段

迭代数组,我为每个数组创建信号,将其映射到一个布尔值,指示字段是否有效

let textFields: [UITextField] = ...
var signals: [Observable<Bool>] = []
textFields.forEach { tf in
     let sig = tf.rx_text
                 .map { string in
                        return string.length > 0
                 }
     signals.append(sig)
}
当组合的信号数量未知时,是否有方法组合信号


或者,是否有一种方法可以编写具有可变数量泛型参数的函数?我认为这将是编写一个函数来组合多个信号而不知道有多少信号的起点

我提出了一个通用的解决方案,除了正确考虑传入空数组的情况外,它似乎正在发挥作用

func combineSignals<T>(signals: [Observable<T>], combine: (T,T)->T ) -> Observable<T> {
    assert (signals.count >= 1)
    guard signals.count >= 2 else { return signals[0] }

    var comb = combineLatest(signals[0], signals[1]) { combine($0) }
    for i in 2..<signals.count {
        comb = combineLatest(comb, signals[i]) { combine($0) }
    }
    return comb
}
func组合信号(信号:[可观察],组合:(T,T)->T)->可观察{
断言(signals.count>=1)
guard signals.count>=2其他{返回信号[0]}
var comb=combinelatetest(信号[0],信号[1]){combine($0)}

我想你能找到答案

事实上,在RxExaples中我找到了很多答案。它们涵盖了很多常见问题

func combineSignals<T>(signals: [Observable<T>], combine: (T,T)->T ) -> Observable<T> {
    assert (signals.count >= 1)
    guard signals.count >= 2 else { return signals[0] }

    var comb = combineLatest(signals[0], signals[1]) { combine($0) }
    for i in 2..<signals.count {
        comb = combineLatest(comb, signals[i]) { combine($0) }
    }
    return comb
}