2015-12-04 16 views
5

sto usando RxSwift 2.0.0-betaRxSwift: Utilizzare Zip con diverso tipo osservabili

Come posso combinare 2 osservabili di tipo diverso in un lampo come il modo?

// This works 
[just(1), just(1)].zip { intElements in 
    return intElements.count 
} 

// This doesn't 
[just(1), just("one")].zip { differentTypeElements in 
    return differentTypeElements.count 
} 

La soluzione attuale che ho è di mappare tutto a un tupla opzionale che combina i tipi, quindi cerniere tuple opzionali in una non-optional.

let intObs = just(1) 
     .map { int -> (int: Int?, string: String?) in 
      return (int: int, string: nil) 
    } 
    let stringObs = just("string") 
     .map { string -> (int: Int?, string: String?) in 
     return (int: nil, string: string) 
    } 
    [intObs, stringObs].zip { (optionalPairs) -> (int: Int, string: String) in 
     return (int: optionalPairs[0].int!, string: optionalPairs[1].string!) 
    } 

Questo è chiaramente piuttosto brutto però. Qual è il modo migliore?

risposta

11

Questo funziona per me. Ho provato a Xcode7, RxSwift-2.0.0-beta

zip(just(1), just("!")) { (a, b) in 
    return (a,b) 
} 
+0

Doh! Sono rimasto bloccato usando l'estensione zip della raccolta invece del solo 'zip'. Grazie! – GDanger

+0

È sicuro presumere che lo zip sia sincrono? – user805981

4

Ecco come farlo funzionare per RxSwift 2.3+

Observable.zip(Observable.just(1), Observable.just("!")) { 
    return ($0, $1) 
} 

o

Observable.zip(Observable.just(1), Observable.just("!")) { 
    return (anyName0: $0, anyName1: $1) 
} 
Problemi correlati