Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RxSwift:对不同类型的观察对象使用Zip_Swift_Rx Swift - Fatal编程技术网

RxSwift:对不同类型的观察对象使用Zip

RxSwift:对不同类型的观察对象使用Zip,swift,rx-swift,Swift,Rx Swift,我正在使用RxSwift 2.0.0-beta 如何以类似zip的方式组合2个不同类型的观察对象 // 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 } 当前

我正在使用RxSwift 2.0.0-beta

如何以类似zip的方式组合2个不同类型的观察对象

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

但这显然相当丑陋。有什么更好的方法吗?

这对我很有效。我在Xcode7、RxSwift-2.0.0-beta中测试了它

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

下面是如何使其适用于RxSwift 2.3+

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

如果您使用单机版(RxSwift 5.0+)

例如:

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()

啊!我一直坚持使用集合类型扩展zip,而不仅仅是常规的
zip
。谢谢假设zip是同步的安全吗?
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()