首页 > 解决方案 > 如何在 swift 中正确创建多维数组?

问题描述

我创建了一个多维数组,但是一旦我尝试在特定索引处向它添加值,它就会崩溃并显示一条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
        }
    }

标签: swiftfor-loopmultidimensional-arrayappend

解决方案


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

如果您的数组填充了值类型(例如Intor Double)并且您具有合理的默认值(例如0),则您提到的用于初始化 multiArray 的方法效果最佳。如果您的数组将保存类实例,则效果不佳。您可以创建数组[[Tile?]]并使用nil值对其进行初始化,但是稍后您必须处理解包选项。该append方法最适合您的情况。


推荐阅读