Это семя идеи.Вместо возврата массивов было бы более эффективно возвращать последовательности.
Вот расширение Array
, которое возвращает два LazyMapSequence<StrideTo<Int>, Element>
.Преимущество в том, что на самом деле не генерирует последовательности;они предоставляются по запросу, потому что они lazy
.Это очень похоже на то, как reversed()
работает на Array
.
extension Array {
func reverseZip() -> (LazyMapSequence<StrideTo<Int>, Element>, LazyMapSequence<StrideTo<Int>, Element>) {
let left = stride(from: 0, to: self.count, by: 2).lazy.map { self[$0] }
let right = stride(from: 1, to: self.count, by: 2).lazy.map { self[$0] }
return (left, right)
}
}
Пример:
let a = [1, 2, 3, 4, 5, 6, 7]
let (left, right) = a.reverseZip()
// iterate left
for i in left {
print(i)
}
1
3
5
7
// turn them into arrays to print them
print(Array(left))
[1, 3, 5, 7]
print(Array(right))
[2, 4, 6]
Я уверен, что это можно обобщить до чего-то более общего, чем Array
.Это оставлено в качестве упражнения для читателя.
Если вы хотите два массива
Если вы действительно хотите два массива, то вы просто вернетесьрезультат map
(вынимает lazy
):
extension Array {
func reverseZip() -> ([Element], [Element]) {
let left = stride(from: 0, to: self.count, by: 2).map { self[$0] }
let right = stride(from: 1, to: self.count, by: 2).map { self[$0] }
return (left, right)
}
}