如何在swift中正确创建多维数组?

时间:2018-05-09 22:03:50

标签: swift for-loop multidimensional-array append

我创建了一个多维数组,但是当我尝试在特定索引处向其添加值时,它会以index out of range消息崩溃。我认为它与我初始化数组的方式有关 - 我必须更具体地说明它可以存储的内容等。在这个线程:Filling the Multidimensional Array in 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 :(得分:2)

你真的在创建一个数组数组。您无法访问尚未创建的索引,因此只需一次创建一个列并向其追加项目,然后将每个列数组追加到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)
}

如果您的数组填充了值类型(例如IntDouble)并且您有一个合理的默认值(例如{{1}),那么您提到的用于初始化multiArray的方法效果最佳})。如果你的数组将持有类实例,它也不会起作用。您可以制作数组0并使用[[Tile?]]值对其进行初始化,但之后您必须处理打开选项的问题。 nil方法最适合您的情况。