swift 改变矩阵中不同列的值会改变一个不同的值

swift changing value in a different column in a matrix changes a different one

这是对Apple // 官方文档中提供的下标选项示例的修改。

所以,我创建了一个结构 -

     struct Matrix {
     let rows: Int, columns: Int
      var print: [Double]
      init(rows: Int, columns: Int) {
      self.rows = rows
      self.columns = columns
      print = Array(repeating:0.0, count:rows * columns) 
       }
       subscript(row: Int, column: Int) -> Double {
        get {
        return print[(row * columns) ]
      }
       set {
        print[(row * columns) ] = newValue
       }
     }
   }

我创建了实例 -

    var mat = Matrix(rows: 3, columns: 3)

现在如果我只设置值 -

     mat[0,0] = 1.0

并打印 -

     print("\(mat[0,0])") //1.0

它打印 1.0,这是应该的

但是当我在上面进行更改并按如下方式设置和打印值时 -

      mat[0,0] = 1.0
      mat[0,1] = 2.0

现在如果我打印

     print("\(mat[0,0])") // 2.0

现在,我的问题是,为什么它 [0,0] 变成了 2.0,虽然我没有改变它。

您创建的不是矩阵,它只是一个Array。当你试图给你的变量 mat 一个值时,你不会将它设置为矩阵中的一个指定位置,而是将值设置为位置 0 并再次设置为 mat 中的 0。结果:mat = [1.0]。接下来设置 mat[0,1] = 2.0。结果:mat = [2.0, 2.0].

例如,要创建一个二维矩阵,请使用:
var matrix = [[Int]]()

现在为此矩阵分配一个值使用:
matrix[0][0] = 1.0
matrix[0][1] = 2.0

您在索引 print 数组时忘记添加 column 值:

struct Matrix {
    let rows: Int, columns: Int
    var print: [Double]
    init(rows: Int, columns: Int) {
        self.rows = rows
        self.columns = columns
        print = Array(repeating:0.0, count:rows * columns)
    }
    subscript(row: Int, column: Int) -> Double {
        get {
            return print[(row * columns) + column]
        }
        set {
            print[(row * columns) + column] = newValue
        }
    }
}

修复之前,所有案例 mat[0,0]mat[0,1]mat[0,2] 都访问相同的值:print[0].

示例:

var mat = Matrix(rows: 2, columns: 3)

mat[0,0] = 1.0
mat[0,1] = 2.0
mat[1,0] = 3.0
mat[1,2] = 4.0

print(mat[0,0])
print(mat[0,1])
print(mat[1,0])
print(mat[1,2])
print(mat)

输出:

1.0
2.0
3.0
4.0
Matrix(rows: 2, columns: 3, print: [1.0, 2.0, 0.0, 3.0, 0.0, 4.0])

备注:

  • print 是一个糟糕的数组名称,因为它也是顶级 Swift 函数。我建议使用其他名称,例如 values.
  • 您应该验证索引并创建一个 fatalError 如果它们超出范围。如果不这样做,那么上例中的 print(mat[0,5]) 将打印 4.0,即使 columns 值超出范围。

    将此检查添加到您的 getset:

    guard (0..<rows).contains(row) else { fatalError("row index out of range") }
    guard (0..<columns).contains(column) else { fatalError("column index out of range") }