Это вопрос хранения вашей матрицы в мажорном порядке строки по сравнению с мажорным порядком столбца .
Основная строка - это когда итерация внешнего массива дает строки, а итерация внутреннего массива - элементы в строке. Поскольку вывод текста (в файл или на терминал) выполняется построчно, это предпочтительно для печати. Однако это означает, что при индексации в форме a[b][c]
первый индекс (b
) - это ваша вертикальная координата (обычно называемая y
), а второй индекс (c
) - ваша горизонтальная координата (обычно называемая x
), что не соответствует обычному соглашению "x
затем y
", к которому вы привыкли. Тем не менее, вы можете легко обойти это, написав собственный оператор индекса, который переворачивает два индекса:
struct Tile {
let blocked: Bool
init(blocked: Bool = false) { self.blocked = blocked }
}
extension Tile: CustomDebugStringConvertible {
var debugDescription: String {
return self.blocked ? "X" : "-"
}
}
struct Gameboard {
var tiles: [[Tile]]
init(tiles: [[Tile]]) {
let width = tiles.first?.count
assert(!tiles.contains(where:) { $0.count != width }, "The tiles must be a square matrix (having all rows of equal length)!")
self.tiles = tiles
}
init(width: Int, height: Int) {
self.init(tiles: (0..<height).map { row in
(0..<width).map { column in Tile() }
})
}
subscript(x x: Int, y y: Int) -> Tile {
return self.tiles[y][x]
}
}
extension Gameboard: CustomDebugStringConvertible {
var debugDescription: String {
let header = (self.tiles.first ?? []).indices.map(String.init).joined(separator: "\t")
let body = self.tiles.enumerated().map { rowNumber, row in
let rowText = row.map { $0.debugDescription }.joined(separator: "\t")
return "\(rowNumber)\t\(rowText)"
}.joined(separator: "\n")
return "\t\(header)\n\(body)"
}
}
let g = Gameboard(width: 5, height: 3)
print(g)
// Example indexing:
let (x, y) = (2, 3)
g[x: x, y; y]
Старший порядок строк также предпочтительнее, поскольку это естественное следствие представления матрицы с использованием вложенных массивов
let matrix = [ // Outer array hold rows
[1, 2, 3] // The inner arrays hold elements within rows
[4, 5, 6]
[7, 8, 9]
] // Thus, this matrix is in row-major order.
Вы можете использовать основной порядок столбцов, чтобы обойти проблему замены индексов, но это означает, что вам нужно транспонировать матрицу , если вы хотите напечатать ее построчно или определить ее, используя литерал вложенного массива.