2016-11-09 94 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

你是一個天才。 –

相關問題