矩阵中不同列中的快速更改值会更改另一列

时间:2018-05-29 10:04:39

标签: swift options subscript

这是对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虽然我没有改变它。

2 个答案:

答案 0 :(得分:1)

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

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") }
    

答案 1 :(得分: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