2016-11-09 18 views
3

私は最近Swift zip機能を発見しました。それはかなり役に立つと思われる。2つ以上の要素を持つタプルを作成するzip関数はありますか?

これは2つの入力配列を取り、各配列からの値のペアのうちのタプルの配列を作成します。

任意の数の配列をとり、同じ数の要素を持つタプルを出力するバリアントがありますか?これを行う方法があるように思われる。

+0

私はSwiftのエキスパートではありませんが、シーケンスパラメータの可変数をとる関数を作成することはできますが、戻り値の型を未知のサイズのタプルとしてどのように宣言しますか? – rmaddy

+0

良い点。ジェネリックを使ってタプルを作成する関数を定義することができます。タプルを作成する要素は入力配列要素の型ですが、可変サイズのタプルを定義する方法はわかりません。 –

答えて

4

いいえ、任意の数の配列に対するzipは、Swiftの可変ジェネリックの欠如のために現在可能ではありません。これはthe Generics Manifestoで議論されています。

一方、私はカスタムアライメントのZipSequencesを生成するためにgybテンプレートを書いていました。私はあなたの便宜のためにアライリティ3...10のZipSequencesをあらかじめ生成しています。

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

プリント:アクションでIt's available here.

1 1.0

2 B 2.0

3 C 3.0

4 D 4.0

5心の中で電子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

クマ、あなたはその後、別の内部の巣1 zip、およびネストされたタプルとそれを解凍することができます:任意のため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個のタプルがありますが、それは仕事を完了します。

+1

あなたは天才です。 –

関連する問題