我最近刚刚发现了Swift zip
函数。这似乎很有用。
它需要2个输入数组,并从每个数组的值对中创建一个元组数组。
是否有zip的变体需要任意数量的数组并输出具有相同数量元素的元组?似乎应该有办法做到这一点。
答案 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 ) }
它产生一个元组数组,每个元组包含三个元素。看起来有点难看,但是只要它可以工作……只要确定要压缩的数组数量,它就可以工作。