Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios &引用;线程1:致命错误:索引超出范围;错误可能是';无法解决_Ios_Swift_Xcode - Fatal编程技术网

Ios &引用;线程1:致命错误:索引超出范围;错误可能是';无法解决

Ios &引用;线程1:致命错误:索引超出范围;错误可能是';无法解决,ios,swift,xcode,Ios,Swift,Xcode,我在这里学习swiftris教程: 本教程是为xcode 7构建的,但我使用的是xcode 10。我有一个错误,线程1:致命错误:索引超出范围,我似乎无法解决。这是我的密码: class Array2D<T> { let columns: Int let rows: Int // #2 var array: Array<T?> init(columns: Int, rows: Int) { self.

我在这里学习swiftris教程:

本教程是为xcode 7构建的,但我使用的是xcode 10。我有一个错误,线程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
          }
      }
  }
类数组2d{
let列:Int
让行:Int
// #2
变量数组:数组
init(列:Int,行:Int){
self.columns=列
self.rows=行
// #3
array=array(unsafeUninitializedCapacity:行*列,初始化为:{uu,{uin})
}
// #4
下标(列:Int,行:Int)->T{
得到{
返回数组[(行*列)+列]
}
设置(新值){
数组[(行*列)+列]=newValue
}
}
}
提前谢谢你

尝试更改#3处的行,如下所示:

     init(columns: Int, rows: Int) {
         self.columns = columns
         self.rows = rows
// #3
         array = Array<T?>(repeating: nil, count: rows * columns)
     }
init(列:Int,行:Int){
self.columns=列
self.rows=行
// #3
数组=数组(重复:无,计数:行*列)
}
init(unsafeUninitializedCapacity:initializingWith:)
不适用于常见用例



通常情况下,Xcode 7(Swift 2)在Swift世界中太老了,您最好找到最新的教程。

在Swift的更高版本中,不需要这样做,因为您可以直接通过“一个或多个数组”创建2D数组,如let matrix=[[Int]]

不过,编写自己的代码以了解数组和索引是如何工作的仍然是一个很好的练习

从这个例子中可以/应该改变两件事。使用
.init(重复:count:)
初始化基础数组,并更改订阅索引,因为它当前不起作用

对于具有x行和y列的0索引数组,即范围为(0,0)到(x-1,y-1)的数组

类数组2d{
let列:Int
让行:Int
变量数组:数组
init(列:Int,行:Int){
self.columns=列
self.rows=行
数组=数组(重复:无,计数:行*列)
}
下标(列:Int,行:Int)->T{

警卫区谢谢!这非常有效。我也理解你关于xcode 7过时的说法。哦,天哪,这太过时了。你的教程可能会让你感到困惑…你正在共享的这段代码是典型的Swift 1/2代码,当时没有本地API来轻松处理2D数组。现在你可以在本地创建2D数组了
var grid=[[Object]]()
并正常访问它
grid[5][3]
。如果您使用行=5和列=5进行初始化,那么您访问它是一个索引:(1,1)到(5,5),还是零索引:(即(0,0)到(4,4)?
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
      }
   }
}
   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
      }
   }