Объединить наблюдаемые на одном типе, а затем цепочку к наблюдаемому другому типу

Существуют ли решения для цепочки Наблюдения различных типов? Я хочу merge Observables, и когда каждый из них отправляет событие Completed , испускайте следующий Observable ( signal ).

then что-то похожее на ReactiveCocoa .

 let signal = Observable<String>.create { observer in observer.onCompleted() return Disposables.create() } let signals: [Observable<Int>] = [Observable.just(1), Observable.just(2), Observable.just(3)] Observable.from(signals).merge().concat(signal).subscribe { print("completed") } 

Тип Element должен быть известен, поэтому у вас есть несколько вариантов, о которых я могу думать:

  1. Сделайте тип Any , которым могут быть как Int и String .
  2. Добавьте соответствие протокола Int и String которое может выставить общий интерфейс, который вы хотите использовать на них.
  3. Сделайте тип enum который имеет случаи как для Int и для String .

Ниже приведена реализация каждого из этих вариантов:

С Any :

 let withAny = PublishSubject<Any>() withAny.subscribe(onNext: { print($0) }) .addDisposableTo(disposeBag) withAny.onNext(1) withAny.onNext("a") 

1

С некоторым protocol :

 protocol SomeProtocol { // put whatever interface from the elements in here } extension String : SomeProtocol {} extension Int : SomeProtocol {} let withProtocol = PublishSubject<SomeProtocol>() withProtocol.subscribe(onNext: { print($0) }) .addDisposableTo(disposeBag) withProtocol.onNext(2) withProtocol.onNext("b") 

2
б

С некоторым enum :

 enum SomeEnum { case int(Int) case str(String) } let withEnum = PublishSubject<SomeEnum>() withEnum.subscribe(onNext: { print($0) }) .addDisposableTo(disposeBag) withEnum.onNext(.int(3)) withEnum.onNext(.str("c")) 

Int (3)
ул ( «с»)

Я реализовал это с помощью takeLast(1) а затем flatMap в требуемом Observable.