web-dev-qa-db-ja.com

RxSwift:さまざまなタイプのオブザーバブルでZipを使用する

RxSwift2.0.0-betaを使用しています

異なるタイプの2つのオブザーバブルをZipのように組み合わせるにはどうすればよいですか?

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

私が持っている現在の回避策は、すべてをタイプを組み合わせたオプションのタプルにマップしてから、オプションのタプルをオプションではないタプルに圧縮することです。

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

しかし、それは明らかにかなり醜いです。より良い方法は何ですか?

11
GDanger

これは私にとってはうまくいきます。 Xcode7、RxSwift-2.0.0-betaでテストしました

Zip(just(1), just("!")) { (a, b) in 
    return (a,b)
}
18
Wonjung Kim

RxSwift2.3 +で動作させる方法は次のとおりです

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

または

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

シングルを使用している場合(RxSwift 5.0以降)

Single.Zip(single1, single2) {
    return ($0, $1)
}

または

Observable.Zip(single1.asObservable(), single2.asObservable()) {
    return ($0, $1)
}

例:

let task = Single
                .Zip(repository.getArrayA(), repository.getArrayB())
                { (a: [A], b: [B]) in
                    return (a, b)
                }                    
                .do(onSuccess: { (Zip) in
                let (a, b) = Zip

                // your code

                //example: self.updateSomething(a, b)

            })
            .asCompletable()
0
norbDEV