我在这里关注swiftris教程:https://www.bloc.io/tutorials/swiftris-build-your-first-ios-game-with-swift#!/chapters/679
本教程是为xcode 7构建的,但是我使用的是xcode10。我有一个错误,线程1:致命错误:索引超出范围,我似乎无法解决。这是我的代码:
class Array2D<T> {
let columns: Int
let rows: Int
// #2
var array: Array<T?>
init(columns: Int, rows: Int) {
self.columns = columns
self.rows = rows
// #3
array = Array<T?>(unsafeUninitializedCapacity:rows * columns, initializingWith: {_,_ in })
}
// #4
subscript(column: Int, row: Int) -> T? {
get {
return array[(row * columns) + column]
}
set(newValue) {
array[(row * columns) + column] = newValue
}
}
}
提前谢谢!
答案 0 :(得分:0)
尝试更改#3处的行,如下所示:
init(columns: Int, rows: Int) {
self.columns = columns
self.rows = rows
// #3
array = Array<T?>(repeating: nil, count: rows * columns)
}
init(unsafeUninitializedCapacity:initializingWith:)
不适用于一般情况。
一般来说,Xcode 7(Swift 2)也是....在Swift世界中已经过时了,您最好找到最新的教程。
答案 1 :(得分:0)
在更高版本的Swift中,不需要这样做,因为您可以直接通过“一个或多个数组”创建2D数组,例如let matrix = [[Int]]。
但是,编写自己的代码以了解数组和索引的工作方式仍然是一个好习惯。
可以从示例中更改两件事。用.init(repeating: count:)
初始化基础数组,并更改下标索引,因为当前它不起作用。
对于具有x行和y列的0索引数组,即一个范围从(0,0)到(x-1,y-1)的
class Array2D<T> {
let columns: Int
let rows: Int
var array: Array<T?>
init(columns: Int, rows: Int) {
self.columns = columns
self.rows = rows
array = Array<T?>(repeating: nil, count: rows * columns)
}
subscript(column: Int, row: Int) -> T? {
guard row <= rows && column <= columns else {fatalError("invalid position"))
get {
return array[(column * columns) + row]
}
set(newValue) {
array[(column * columns) + row] = newValue
}
}
}
对于1索引数组,即(1,1)到(x,y),您需要将下标更改为:
subscript(column: Int, row: Int) -> T? {
guard row < rows && column < columns else {fatalError("invalid position"))
get {
return array[((column - 1) * columns) + (row - 1)]
}
set(newValue) {
array[((column - 1) * columns) + (row - 1)] = newValue
}
}