无法解决“线程1:致命错误:索引超出范围”错误

时间:2019-11-23 23:44:51

标签: ios swift xcode

我在这里关注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
          }
      }
  }

提前谢谢!

2 个答案:

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