我正在尝试创建一个UIViews的2D数组,一切似乎都在工作,直到我尝试用数据填充数组。我收到错误:“致命错误:索引超出范围”
我现在有什么:
var gridArray : [[UIView]] = [[UIView]] ()
现在我尝试使用UIViews填充数组:
for y in 0 ... 10 {
for x in 0 ... 10 {
let cell : UIView!
cell = UIView(frame: CGRect(x:10, y:10, width:10, height:10))
self.view?.addSubview(cell)
gridArray[x][y] = cell
}
}
答案 0 :(得分:1)
问题是您正在创建一个数组数组,但您没有创建内部数组。您无法索引到空数组。您可以像这样创建11 x 11
UIView?
数组:
var gridArray: [[UIView?]] = Array(repeating: Array(repeating: nil, count: 11), count: 11)
然后用UIView
s填充数组的代码将起作用。稍后阅读时需要打开UIView?
,但由于您使用UIView
填充数组,因此强制解包可以在不崩溃的情况下工作。
let cell = gradArray[x][y]!
正如@rmaddy在评论中指出的那样,您可以使用虚拟UIView 来初始化数组:
var gridArray: [[UIView]] = Array(repeating: Array(repeating: UIView(), count: 11), count: 11)
这个UIView
将有121个引用它,并且在所有对它的引用被真实的UIView
替换之后它将被ARC释放。
优点是您可以避免可选 UIView
,因此不需要展开。
此外,您可以删除该类型,因为Swift可以推断它:
var gridArray = Array(repeating: Array(repeating: UIView(), count: 11), count: 11)
答案 1 :(得分:1)
使用默认初始化程序初始化Array时,Array为空,不能下标到空数组。
在使用下标访问数组之前,您需要将实际内容填入数组:
{{1}}