2015-12-04 14 views
5

Używam RxSwift 2.0.0 betaRxSwift Use pocztowy z innego typu obserwable

Jak mogę połączyć 2 obserwable różnych typów w zamek podobny sposób?

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

Obecny obejście mam jest mapowanie wszystko do opcjonalnego krotki, która łączy poszczególne typy, wówczas zamki opcjonalne krotki na zakaz, opcjonalne.

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!) 
    } 

To oczywiście dość brzydkie. Jaki jest lepszy sposób?

Odpowiedz

11

To działa dla mnie. Testowałem go w Xcode7, RxSwift-2.0.0-beta

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

Doh! Utknąłem na używaniu rozszerzenia z rozszerzeniami kolekcji zamiast zwykłego 'zip'. Dzięki! – GDanger

+0

Czy można bezpiecznie założyć, że zip jest synchroniczny? – user805981

4

Oto jak zrobić to praca dla RxSwift 2.3+

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

lub

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