2015-12-04 20 views
5

Tôi đang sử dụng RxSwift 2.0.0-betaRxSwift: Sử dụng Zip với các loại quan sát khác nhau

Làm cách nào để kết hợp 2 loại quan sát khác nhau theo cách nén?

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

Cách giải quyết hiện tại mà tôi có là ánh xạ mọi thứ vào một bộ tùy chọn kết hợp các loại, sau đó nén tuple tùy chọn thành một bộ không bắt buộc.

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

Rõ ràng là khá xấu xí. Cách tốt hơn là gì?

Trả lời

11

Điều này phù hợp với tôi. Tôi đã thử nghiệm nó trong Xcode7, RxSwift-2.0.0-beta

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

Doh! Tôi đã bị mắc kẹt khi sử dụng zip của các loại bộ sưu tập mở rộng thay vì chỉ là 'zip' thông thường. Cảm ơn! – GDanger

+0

Có an toàn để giả định rằng zip là đồng bộ không? – user805981

4

Sau đây là cách để làm cho nó làm việc cho RxSwift 2.3+

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

hoặc

Observable.zip(Observable.just(1), Observable.just("!")) { 
    return (anyName0: $0, anyName1: $1) 
} 
Các vấn đề liên quan