Как правильно создать многомерный массив в Swift? - PullRequest
0 голосов
/ 10 мая 2018

Я создал многомерный массив, но как только я пытаюсь добавить к нему значения по определенным индексам, он вылетает с сообщением index out of range. Я думаю, что это связано с тем, как я инициализирую массив - я должен быть более конкретным в отношении того, что он может хранить и т. Д. В этой теме: Заполнение многомерного массива в Swift было предложено, чтобы я инициализировать массив следующим образом (очевидно, модифицированный для моих целей):

var array: [[Int]] = Array(count:N, repeatedValue:Array(count:N, repeatedValue:0))

Но я не заставил это работать, и не понял это должным образом. Ниже приведен код, который у меня есть. Вылетает в последней строке кода.

    var multiArray = [[Tile]]()

    var gb = gameBoard.frame.width/4

    for xItem in 0...3 { //DRAW TILE ON X AXIS

        for yItem in 0...3 { //DRAW TILE ON Y AXIS
            //CREATES A VARIABLE FOR TILE WITH PROPERTIES
            tileView = Tile(frame: CGRect(x: (CGFloat(xItem) * gb), y: (CGFloat(yItem) * gb), width: gb, height: gb))

            gameBoard.addSubview(tileView) //DRAWS TILE ONTO PARENT VIEW
            multiArray[xItem][yItem] = tileView   //CRASHES HERE WHEN TRYING TO ADD TO INDEX
        }
    }

1 Ответ

0 голосов
/ 10 мая 2018

Вы действительно создаете массив массивов. Вы не можете получить доступ к индексам, которые еще не созданы, поэтому вместо этого просто создавайте один столбец за раз и добавляйте к нему элементы, а затем добавляйте каждый массив столбцов в multiArray:

var multiArray = [[Tile]]()

var gb = gameBoard.frame.width/4

for xItem in 0...3 { //DRAW TILE ON X AXIS
    var col = [Tile]()

    for yItem in 0...3 { //DRAW TILE ON Y AXIS
        //CREATES A VARIABLE FOR TILE WITH PROPERTIES
        tileView = Tile(frame: CGRect(x: (CGFloat(xItem) * gb), y: (CGFloat(yItem) * gb), width: gb, height: gb))

        gameBoard.addSubview(tileView) //DRAWS TILE ONTO PARENT VIEW
        col.append(tileView)
    }

    multiArray.append(col)
}

Метод, который вы упомянули для инициализации multiArray, работает лучше всего, если ваш массив заполнен типами значений (например, Int или Double), и у вас есть разумное значение по умолчанию (например, 0). Это не сработает, если ваш массив будет содержать экземпляры классов. Вы могли бы создать свой массив [[Tile?]] и инициализировать его значениями nil, но позже вам придется разобраться с развертыванием опций. append метод лучше всего подходит для вашего случая.

...