2014-06-23 50 views
5

我有兩個數組,如[1, 2, 3]["a", "b", "c"],我想使用Zip2在壓縮值(1, "a")(2, "b")(3, "c")上映射。你如何映射Zip2的值?

如果我這樣做:

let foo = map(Zip2([1, 2, 3], ["a", "b", "c"]).generate()) { $0.0 } 

FOO有型ZipGenerator2<IndexingGenerator<Array<Int>>, IndexingGenerator<Array<String>>>?

有沒有辦法讓這個數組?

+0

我對這個問題有點困惑。我發現它已經被回答了,但是如果你剛好在Array結果之後,爲什麼不這麼做呢: 'let foo = map(Zip2([1,2,3],[「a」,「b」,「 c「])){$ 0.0}' 然後'foo'是一個數組。 –

+0

似乎合理。要麼是我沒有嘗試的東西,要麼自從我提出這個問題後,Swift庫已經有所改進。 – alltom

回答

6

下面將讓你從ZIP2的返回值的數組:

var myZip = Zip2([1, 2, 3], ["a", "b", "c"]).generate() 
var myZipArray: Array<(Int, String)> = [] 

while let elem = myZip.next() { 
    myZipArray += elem 
} 

println(myZipArray) // [(1, a), (2, b), (3, c)] 

- 更新:更加美好! -

let myZip = Zip2([1, 2, 3], ["a", "b", "c"]) 
let myZipArray = Array(myZip) 

println(myZipArray) // [(1, a), (2, b), (3, c)] 

- 現在爲樂趣 -

我要去猜測,我們可以初始化與任何響應generate()一個新的陣列?

println(Array("abcde")) // [a, b, c, d, e] 
0

假設valsZip2的結果,我認爲這是一個兩元組數組。像這樣:

let vals = [(1, "a"), (2, "b"), (3, "c")] 

因此,只需調用數組上的map()方法即可。

vals.map { $0.0 } 

例如:

> vals.map { $0.1 } 
$R16: String[] = size=3 { 
    [0] = "a" 
    [1] = "b" 
    [2] = "c" 
} 
+0

Zip2是一個結構體,而不是元組數組。 :\ – alltom

+0

當我使用像map(0..5){$ 0}這樣的範圍的映射時,我通過像'Array(map(0..5){$ 0})'''包裝它得到一個數組。我正在尋找Zip2生成器的類似變換(我認爲)。 – alltom

+0

然後不要使用Zip2。 :-)這顯然是從Objective-C時代開始的,元組不存在第一類對象。 – GoZoner