#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 }
, я получаю массив, оборачивая его likeArray(map(0..5) { $0 })
. Я ищу аналогичное преобразование для генератора Zip2 (я думаю).3. Тогда не используйте Zip2. 🙂 Это явно пережиток времен Objective-C, когда кортежи не существовали как объекты первого класса.