swift: matrix 转化 array

关键字: 下标, 初始化, 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来使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值