是否有zip函数来创建包含2个以上元素的元组?

时间:2016-11-09 23:33:05

标签: swift

我最近刚刚发现了Swift zip函数。这似乎很有用。

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

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

3 个答案:

答案 0 :(得分:8)

请记住,您可以将一个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)")
}

不像任意n元组有zip那么优雅,但它完成了工作。

答案 1 :(得分:7)

不,由于斯威夫特缺乏可变参数,因此目前无法使用zip任意数量的序列。这在the Generics Manifesto中进行了讨论。

与此同时,我编写了一个gyb模板,用于生成自定义arity的ZipSequences。为方便起见,我还预先生成了arity 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 a 1.0

     

2 b 2.0

     

3 c 3.0

     

4 d 4.0

     

5 e 5.0

答案 2 :(得分:0)

您可以像以前的某些答案一样使用嵌套的zip方法,并使用map来使结果变平:

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

它产生一个元组数组,每个元组包含三个元素。看起来有点难看,但是只要它可以工作……只要确定要压缩的数组数量,它就可以工作。