2016-11-09 40 views
3

我刚刚发现了Swift zip函数。这似乎很有用。是否有一个zip函数来创建超过2个元素的元组?

它需要2个输入数组,并从每个数组的值对中创建一个元组数组。

是否有一个zip的变体,它接受任意数量的数组并输出具有相同数量元素的元组?似乎应该有办法做到这一点。

+0

我不是Swift的专家,但是虽然您可以创建一个接受可变数量的序列参数的函数,但是如何将返回类型声明为未知大小的元组? – rmaddy

+0

好点。您可以使用泛型来定义创建元组的元素,这些元素是输入数组元素的类型,但我不知道Swift中定义可变大小的元组的方式。 –

回答

4

对于任意数量的序列而言,否,zip由于Swift缺乏可变参数类型而当前不可行。这在the Generics Manifesto中讨论。

与此同时,我写了一个gyb模板来生成自定义元组的ZipSequences。为了您的方便,我还预先生成了序列号为3...10的ZipSequences。 It's available here.

在动作:

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

打印:

1 1.0

2 B 2.0

3c的3.0

4 d 4.0

5e的5.0

+0

感谢您提供的结论性答案以及与泛型宣言的链接。 –

+0

你可以编写自己的zip3或基于源代码的网站:https://github.com/apple/swift/blob/master/stdlib/public/core/Zip.swift – Alexander

+0

@DuncanC我有一点空闲时间:https://github.com/amomchilov/ZipNsequence – Alexander

5

。记住,你可以嵌套一个zip内的另一个,然后用一个嵌套的元组解包:

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

不太一样优雅具有任意一个zip n元组,但它完成了工作。

+1

你是一个天才。 –

相关问题