Swift 3 - UIView的2D数组

时间:2017-01-04 02:41:55

标签: arrays swift uiview

我正在尝试创建一个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
    }
}

2 个答案:

答案 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}}