Is there a zip function to create tuples with more than 2 elements? Is there a zip function to create tuples with more than 2 elements? swift swift

Is there a zip function to create tuples with more than 2 elements?


Bear in mind, you can nest one zip inside another, and then unpack it with a nested tuple:

let integers = [1, 2, 3, 4, 5]let strings = ["a", "b", "c", "d", "e"]let doubles = [1.0, 2.0, 3.0, 4.0, 5.0]for (integer, (string, double)) in zip(integers, zip(strings, doubles)) {    print("\(integer) \(string) \(double)")}

Not quite as elegant as having a zip for arbitrary n-tuples, but it gets the job done.


No, zip for an arbitrary number of sequences isn't currently possible due to Swift's lack of variadic generics. This is discussed in the Generics Manifesto.

In the meanwhile, I wrote a gyb template for generating ZipSequences of custom arity. I've also pre-generated ZipSequences of arity 3...10 for your convenience. It's available here.

In action:

let integers = [1, 2, 3, 4, 5]let strings = ["a", "b", "c", "d", "e"]let doubles = [1.0, 2.0, 3.0, 4.0, 5.0]for (integer, string, double) in zip(integers, strings, doubles) {    print("\(integer) \(string) \(double)")}

Prints:

1 a 1.0

2 b 2.0

3 c 3.0

4 d 4.0

5 e 5.0


You can use the nested zip approach as in some of the previous answers, and use map to flatten the result:

let combined = zip(integers, zip(strings, doubles)).map { ( $0.0, $0.1.0, $0.1.1 ) }

It yields an array of tuples, each with three elements. Looks a bit ugly but as long as it works… It does work as long as the number of arrays to zip is fixed.