这是对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虽然我没有改变它。
答案 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
值超出范围。
将此检查添加到get
和set
:
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