Давайте начнем с этого массива:
let array = [[[2,2],[8,8]],[[4,4],[1,1]]]
Свести его и отсортировать по первому элементу каждого подмассива:
let flat = array.flatMap { $0 }
.sorted { $0.first ?? 0 < $1.first ?? 0 }
Теперь нам нужно сгруппировать каждый элемент в четный индекс со следующим элементом:
let start = flat.startIndex
let end = flat.endIndex
let even = stride(from: start, to: end, by: 2).map { flat[$0] }
let odd = stride(from: flat.index(start, offsetBy: 1), to: end, by: 2).map { flat[$0] }
let zipped = zip(even, odd)
let newArray = zipped.map { [$0.0, $0.1]}
И теперь вы можете использовать результат:
print(newArray) //[[[1, 1], [2, 2]], [[4, 4], [8, 8]]]
Более эффективный способ создания пар из элементов с четными и нечетными индексами состоит в использовании этого красивого расширения matt :
extension Sequence {
func clump(by clumpsize:Int) -> [[Element]] {
let slices : [[Element]] = self.reduce(into:[]) {
memo, cur in
if memo.count == 0 {
return memo.append([cur])
}
if memo.last!.count < clumpsize {
memo.append(memo.removeLast() + [cur])
} else {
memo.append([cur])
}
}
return slices
}
}
И используйте это так:
let array = [[[2,2],[8,8]],[[4,4],[1,1]]]
let flat = array.flatMap { $0 }
.sorted { $0.first ?? 0 < $1.first ?? 0 }
let newArray = flat.clump(by: 2)
print(newArray) //[[[1, 1], [2, 2]], [[4, 4], [8, 8]]]