Swift学习笔记 | Subscript(自定义下标)

作者: 卡巴拉的树 | 来源:发表于2016-09-26 20:31 被阅读1590次

    在swift中,class, structuresenum都可以定义subscriptsubscript可以帮助我们更方便的访问或者设置一个集合中的某个成员。

    下面借助一个官网的实例可以帮助我们更清楚的明白这个功能。

    struct Matrix {
        let rows: Int, columns: Int
        var grid: [Double]
        init(rows: Int, columns: Int) {
            self.rows = rows
            self.columns = columns
            grid = Array(repeating: 0.0, count: rows * columns)
        }
        func indexIsValid(row: Int, column: Int) -> Bool {
            return row >= 0 && row < rows && column >= 0 && column < columns
        }
        subscript(row: Int, column: Int) -> Double {
            get {
                assert(indexIsValid(row: row, column: column), "Index out of range")
                return grid[(row * columns) + column]
            }
            set {
                assert(indexIsValid(row: row, column: column), "Index out of range")
                grid[(row * columns) + column] = newValue
            }
        }
    }
    

    上面的代码定义了一个结构体Matrix,我们通过设置row和column来初始化一个矩阵:

    var matrix = Matrix(rows: 2, columns: 2)
    

    但是在内部却是用一个数组来存储的,存储结构就变成一维的了

    grid = [0.0, 1.0, 2.0, 3.0]
    

    我们要获取第三个元素2.0就需要通过grid[2]来访问了,假如我们还是想通过row与column来访问grid中的数据呢?

    这时候就是subscript登场的时候了。

    我们通过定义subscript(row: Int, column: Int) -> Double来自动计算row与column实际上对应的是grid中的哪个值,grid用row与cloumn表示出来就是一个2*2的矩阵:

    grid = [ 0,0, 1.0,
             2.0, 3.0]
    

    row与column与grid中的下标对应的关系也就是: index = row*维度+column
    这样我们就可以用如下方式来设置或者获取matrix中的元素值:

    matrix[0, 1] = 1.5
    matrix[1, 0] = 3.2
    

    在这个例子中,我们还用了indexIsValid来判断row与column是否在矩阵范围内。

    相关文章

      网友评论

        本文标题:Swift学习笔记 | Subscript(自定义下标)

        本文链接:https://www.haomeiwen.com/subject/wfngettx.html