2016-08-20 8 views

答えて

10

mergeこれらは、同じ種類のものが必要です()。

したがって、1つのオプションは、型情報を破棄してAnyObjectにキャストすることです。今、彼らはマージすることができます。

let stringSubject = PublishSubject<String>() 
let stringObservable = stringSubject.asObservable().map { $0 as AnyObject } 

let intSubject = PublishSubject<Int>() 
let intObservable = intSubject.asObservable().map { $0 as AnyObject } 

Observable.of(stringObservable, intObservable).merge() 
    .subscribeNext { print($0) } 
    .addDisposableTo(disposeBag) 

stringSubject.onNext("a") 
stringSubject.onNext("b") 
intSubject.onNext(1) 
intSubject.onNext(2) 
stringSubject.onNext("c") 

出力:


B
C

別のオプションは、列挙型で、その後ラップするだろう:

enum Container { 
    case S(String) 
    case I(Int) 
} 

let stringSubject = PublishSubject<String>() 
let stringObservable = stringSubject.asObservable().map { Container.S($0) } 

let intSubject = PublishSubject<Int>() 
let intObservable = intSubject.asObservable().map { Container.I($0) } 

Observable.of(stringObservable, intObservable).merge() 
    .subscribeNext { e in 
     switch e { 
     case .S(let str): 
      print("next element is a STRING: \(str)") 
     case .I(let int): 
      print("next element is an INT: \(int)") 
     } 
    } 
    .addDisposableTo(disposeBag) 

stringSubject.onNext("a") 
stringSubject.onNext("b") 
intSubject.onNext(1) 
intSubject.onNext(2) 
stringSubject.onNext("c") 

出力:
次の要素が文字列である:

次の要素が文字列である2
次:1つの
次の要素がINTである:
次の要素BがINTであります要素がSTRINGである:様々なタイプのObservableを組み合わせることができる他の演算子として

C(等zipおよびcombineLatest)、全く動作しないものは全くありません。merge。しかし、それらをチェックしてください。彼らはあなたの要求にもっと適しているかもしれません。

関連する問題