swift - 如何在 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
}
}
解决方案
您实际上是在创建一个数组数组。您无法访问尚未创建的索引,因此只需一次创建一列并将项目附加到它,然后将每个列数组附加到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
or Double
)并且您具有合理的默认值(例如0
),则您提到的用于初始化 multiArray 的方法效果最佳。如果您的数组将保存类实例,则效果不佳。您可以创建数组[[Tile?]]
并使用nil
值对其进行初始化,但是稍后您必须处理解包选项。该append
方法最适合您的情况。
推荐阅读
- azure - Azure.Fluent.Management 和 Azure.Storage.Blobs 包之间的冲突?
- stata - Stata:根据年度数据减少观察
- c++ - 如果有一种方法可以构造代码以便更容易推理
- hadoop - Hadoop namenode 和辅助 nemenode 概念
- ruby-on-rails - 带有命名空间或预期行为的 ActiveRecord 错误?
- python - Python添加一个循环遍历字段的函数
- android - letterSpacing 和 lineSpacingMultiplier 可以在android的样式文件中声明吗?
- c - 在 SIGSEVG 信号后中断无限循环
- python - 使用字典条目拆分/分解 Pandas 列
- modelica - Dymola中求解非线性系统模型的最大能力是多少?