Как вы сопоставляете значения Zip2?

#swift

#swift

Вопрос:

У меня есть два массива, такие как [1, 2, 3] и ["a", "b", "c"] , и я хочу сопоставить сжатые значения (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>>>? .

Есть ли способ сделать это массивом?

Комментарии:

1. Я немного смущен этим вопросом. Я вижу, что на него уже был дан ответ, но если вам нужен результат массива, почему бы просто не сделать это: let foo = map(Zip2([1, 2, 3], ["a", "b", "c"])) { $0.0 } Тогда foo это массив.

2. Кажется разумным. Либо это то, что я не пробовал, либо библиотека Swift улучшилась с тех пор, как я задал этот вопрос.

Ответ №1:

Следующие действия приведут к получению массива из возвращаемого значения 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]
 

Ответ №2:

Предположим, что vals это результат Zip2 , который, как я предполагаю, представляет собой массив из двух кортежей. Вот так:

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

Комментарии:

1. Zip2 — это структура, а не массив кортежей. :

2. Когда я использую map с диапазоном like map(0..5) { $0 } , я получаю массив, оборачивая его like Array(map(0..5) { $0 }) . Я ищу аналогичное преобразование для генератора Zip2 (я думаю).

3. Тогда не используйте Zip2. 🙂 Это явно пережиток времен Objective-C, когда кортежи не существовали как объекты первого класса.