在Swift

时间:2019-02-11 17:58:49

标签: swift

我对Swift还是很陌生,这个问题让我很困惑。我正在尝试创建一个二维地图。在我的Map类的初始化中,我需要创建另一个名为Grid的类的二维数组。

这就是我现在拥有的:

class Map: NSObject {
    var squares: [[Grid]]
    let MAXROWS = 200
    let MAXCOLUMNS = 200

    override init(){
         for r in 0...MAXROWS{
             for c in 0...MAXCOLUMNS{
                squares[r][c].append
            }
        }
    }

在append函数中,它会产生一个错误:

  

“网格”类型的值没有成员“附加”

如何正确执行此操作?

3 个答案:

答案 0 :(得分:3)

或者,如果您不喜欢原始循环:

override init(){
    self.squares = Array<[Grid]>(
        repeating: Array<Grid>(
            repeating: Grid(),
            count: MAXCOLUMNS),
        count: MAXROWS
    )
}

edit:就像Alain T提到的一样,这仅在Grid是一个结构时才有效,否则在整个2d数组中将使用相同的实例。这是因为类是通过引用传递的,在这种情况下,每次都会使用相同的引用。

答案 1 :(得分:1)

尝试:

class Map: NSObject {
var squares: [[Grid]]
let MAXROWS = 200
let MAXCOLUMNS = 200

override init(){
     for r in 0...MAXROWS{
        squares.append([])
         for c in 0...MAXCOLUMNS{
            squares[r].append(Grid())
        }
    }
}

答案 2 :(得分:0)

您也可以这样做(因为Grid是一个类):

squares = (0..<MAXROWS).map{_ in (0..<MAXCOLUMNS).map{_ in Grid()}}

这使用范围作为“生成”数组中所需元素数量的方法。 map()函数为每个生成的数字返回一个条目。行的条目是列的数组,每个列包含一个Grid对象的新实例。 map()闭包内的“ _ in”告诉编译器我们实际上并未使用范围产生的值。