关键字: 下标, 初始化, matrix, get set, assert
本篇是关于struct基本设定和用法,以及如何将一个matrix,以array 的形式排列出来
struct Matrix {
var rows, columns: Int
var grid: [Int]
init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns
grid = Array(repeating: 0, count: rows * columns)
}
func checkIndexIsValid(row: Int, column: Int) -> Bool {
return row >= 0 && row < rows && column >= 0 && column < columns
}
subscript(row: Int, column: Int) -> Int{
get {
assert(checkIndexIsValid(row: row, column: column), "invalid Index")
// array to matrix, array index = column + [row * totoal column]
return grid[(column + (row * columns))]
}
set {
assert(checkIndexIsValid(row: row, column: column), "invalid Index")
//return grid里某个元素等于这个新值
grid[(column + (row * columns))] = newValue
}
}
}
我们先建一个struct,struct是属于value type属性,和reference type不同的是,value是一个唯一复制,也就是说当我们用struct设置不同的变量的时候,每一个变量都是唯一的,而当我们用reference type设置不同变量的时候,每一个变量都会指向同一个reference。需要注意的是value是轻量级的,如果我们需要设置一些参数,那就用value,如果需要设置一些方法,那就用reference(class)。这里我的struct是为了设置一个matrix,它的初始化我们需要两个参数,一个它的行数 row,和它的列数 column,同时我先把它的grid,这里我用的是一个array,所以这个matrix的行和列的参数还是一个一维的array。一会我会进行转化。
subscript(row: Int, column: Int) -> Int{
get {
assert(checkIndexIsValid(row: row, column: column), "invalid Index")
// array to matrix, array index = column + [row * totoal column]
return grid[(column + (row * columns))]
}
set {
assert(checkIndexIsValid(row: row, column: column), "invalid Index")
//return grid里某个元素等于这个新值
grid[(column + (row * columns))] = newValue
}
}
想要将一个多维的matrix变成一个一维的array,公式是
列数 + (行数 * 总列数)
这里我用下标的方式方便一会我设置某行某列等于我想要的参数。为了防止设置的行和列出超标,我用了assert关键字,如果assert 里的第一个参数是false,就会终止运行,并有一个错误信息“invalid index”。
这里我也用到了get set关键字。get是取到某个值,set是设置某个值,比如我有一个array a,a[0] 就是我想取到的值,a[0] = 1就是我想设置的值。在这里我想取出它的一维array里的这个值,就用到get。在我设置的时候,就等于我想要赋予这个值的新值
最后是用法
var m1 = Matrix(rows: 3, columns: 3)
m1[0,0] = 10
print(m1) // Matrix(rows: 3, columns: 3, grid: [10, 0, 0, 0, 0, 0, 0, 0, 0])
我先设定一个3 X 3的matrix,并设定它的第一行第一列的值是10,打印出来它的grid就是一个一维的array,但我们也可以把它当作一个matrix来使用