2015-11-30 5 views
1

Я использую RxSwift. У меня есть массив текстовых полей, зависящий от того, какой интерфейс видим; он может иметь 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) 
} 

Обычно, чтобы объединить несколько сигналов, я хотел бы использовать combineLatest, который имеет несколько вариантов, чтобы взять в другой ряд аргументов, которые, как правило, выглядят так, если бы я имел три сигнала

_ = combineLatest(sig1, sig2, sig3) { $0 } 
     .subscribeNext { [weak self] valid in 
      self!.someButton.enabled = valid 
     } 
     .addDisposableTo(disposeBag) 

ли существует способ комбинировать сигналы, когда количество объединяемых сигналов неизвестно?

В качестве альтернативы, существует ли способ написать функцию с переменным числом общих аргументов? Я думаю, что это будет отправной точкой для написания функции для объединения нескольких сигналов, не зная, сколько.

ответ

1

Я придумал общее решение, которое, кажется, работает, за исключением того, что правильно учитывает случай передачи в пустом массиве.

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 
} 
0

Я думаю, вы можете найти ответ here

На самом деле в RxExaples я нашел много ответов. Они покрывают множество проблем с комом там

Смежные вопросы