我创建了一个多维数组,但是当我尝试在特定索引处向其添加值时,它会以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
}
}
答案 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)
}
如果您的数组填充了值类型(例如Int
或Double
)并且您有一个合理的默认值(例如{{1}),那么您提到的用于初始化multiArray的方法效果最佳})。如果你的数组将持有类实例,它也不会起作用。您可以制作数组0
并使用[[Tile?]]
值对其进行初始化,但之后您必须处理打开选项的问题。 nil
方法最适合您的情况。