Como achatar uma matriz * dessa maneira * rapidamente?

Eu fiz uma pergunta semelhante há um tempo atrás. Estava perguntando como posso transformar uma matriz como esta:

[[1,2,3],[4,5,6],[7,8,9]]

para isso:

[1,2,3,4,5,6,7,8,9]

Mas agora eu quero transformar esse mesmo array para isso:

[1,4,7,2,5,8,3,6,9]

Suponha que todas as sub-matrizes tenham o mesmo comprimento.

Se você ainda não percebeu, os três primeiros itens no resultado são o primeiro dos três subarrays. O quarto, quinto e sexto itens no resultado é o segundo item de cada subarray.

Se você ainda não entende, talvez isso ajude:

Matriz original:

[
    [1,2,3],
    [4,5,6],
    [7,8,9]
]

Resultado:

[
    1,4,7,
    2,5,8,
    3,6,9
]

No momento, eu tenho o seguinte:

func flatten(array: [[Int]]) -> [Int] {
    var flat = [Int]()
    for i in 0..<array[0].count {
        for subarray in array {
            flat.append(subarray[i])
        }
    }
    return flat
}

Eu não acho isso muito legal. Como posso fazer isso de uma maneira rápida?

Apenas para evitar ser um problema XY, eis porque eu quero fazer isso.

Estou desenvolvendo um jogo de tabuleiro. estou usandoHLGridNode (É basicamente um monte de quadrados em um layout semelhante a uma grade) deHLSpriteKit como o tabuleiro do jogo de tabuleiro. Para editar o conteúdo do nó da grade, preciso passar uma matriz 1D de nós sprite, não uma matriz 2D.

Para facilitar minha vida, eu armazenei os objetos do modelo em uma matriz 2D. Dessa forma, posso me referir aos quadrados quadrados 5 da esquerda e 2 quadrados da parte superior apenas fazendo:

modelObjects[5][2]

Se eu achatar a matriz 2D usando.flatMap { $0 } e passar o resultado para o nó da grade,modelObjects[5][2] pareceria ser 2 quadrados da esquerda e 5 quadrados do topo.

Esta não é uma duplicata deesta porque essa pergunta parece ter um número definido de matrizes para trabalhar. Embora eu possa colocar minha matriz 2D em um loop, e fazer issoenumerate().map {...} coisas, parece uma abordagem muito demorada. Eu acho que deve ser mais simples fazer isso com matrizes 2D.

questionAnswers(2)

yourAnswerToTheQuestion