Ios 合并一种类型上的可观察对象,然后链接到另一种类型的可观察对象

Ios 合并一种类型上的可观察对象,然后链接到另一种类型的可观察对象,ios,swift,rx-swift,Ios,Swift,Rx Swift,是否有链接不同类型观测值的解决方案? 我想合并观察对象,当每个观察对象发送Completed事件时,发出下一个观察对象(信号) 类似于reactivecococoa的然后 let signal = Observable<String>.create { observer in observer.onCompleted() return Disposables.create() } let signals: [Observable<Int>] = [Obs

是否有链接不同类型观测值的解决方案? 我想合并观察对象,当每个观察对象发送
Completed
事件时,发出下一个观察对象(
信号

类似于
reactivecococoa
然后

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")
}
let signal=Observable.create{observator in
observer.onCompleted()
返回一次性物品。创建()
}
让信号:[可观察]=[可观察。刚好(1),可观察。正好(2),可观察。刚好(3)]
可观察。从(信号).merge().concat(信号).subscribe{
打印(“已完成”)
}

需要知道
元素的类型
,因此我可以考虑以下几个选项:

  • Any
    类型设置为
    Int
    String
    都可以
  • 将协议一致性添加到
    Int
    String
    ,这可以公开您想要在它们上使用的公共接口
  • 将类型设为
    enum
    ,该类型同时具有
    Int
    String
    的大小写
  • 下面是每个选项的实现:

    使用
    任意
    : 2
    b

    使用一些
    枚举
    enum SomeEnum{
    案例int(int)
    案例str(字符串)
    }
    let withEnum=PublishSubject()
    订阅(onNext:{print($0)})
    .addDisposableTo(disposeBag)
    withEnum.onNext(.int(3))
    withEnum.onNext(.str(“c”))
    
    int(3)
    str(“c”)


    我通过
    takeLast(1)
    然后
    flatMap
    实现了这一点。

    你认为
    takeLast(1)
    然后做
    flatMap
    怎么样?是的,只要你不想使用原始
    observatable
    的元素,那就行了,但只需将其用作触发第二个可观察的
    的方法。从你的问题来看,听起来好像你真的想要两者的元素,链接起来。如果您打算使用
    takeLast
    flatMap
    ,那么您可以更简单地使用
    concat
    。只要您确信在原始的
    可观察的
    上至少会得到一个元素,它就会产生相同的效果。
    
    let withAny = PublishSubject<Any>()
    
    withAny.subscribe(onNext: { print($0) })
        .addDisposableTo(disposeBag)
    
    withAny.onNext(1)
    withAny.onNext("a")
    
    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")
    
    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"))