我对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函数中,它会产生一个错误:
“网格”类型的值没有成员“附加”
如何正确执行此操作?
答案 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”告诉编译器我们实际上并未使用范围产生的值。