免费开源的iOS开发学习平台

Swift:13 下标

数组、字典集合类型的元素是通过下标进行访问的,在Swift中,类、结构体和枚举也都可以定义下标。可以通过下标重载函数来为同一个类型定义多种下标。而且,下标语法不局限于单一的维度,可以使用多个形参来定义多维下标。

下标语法

下标语法和实例方法的语法以及计算属性的语法类似。通过subscript关键词来定义下标,定义一个或者多个输入形参和一个返回类型。通过getter和setter来进行获取或者设置下标。

subscript(index: Int)-> Int {
    get{
        //返回下标的值
    }
    set(newValue){
        //设置下标的值
    }
}
//只读下标,可以简写如下
subscript(index: Int) -> Int {
    //返回下标值
}

下标的选项

下标可以接收任意数量的输入形参,而且这些形参可以是任何类型。下标还可以返回任何类型。下标可以使用变量形参和可变形参,但是无法使用in-out形参或者提供默认形参值。

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), "下标越界")
            return grid[(row * columns) + column]
        }
        set {
            assert(indexIsValid(row: row, column: column), "下标越界")
            grid[(row * columns) + column] = newValue
        }
    }
    
    func toString() {
        for i in 0..<rows {
            for j in 0..<columns{
                print("\(self[i,j])",terminator:",")
            }
            print("")
        }
    }
}
var matrix = Matrix(rows: 2, columns: 3)
matrix[0,0] = 1.0
matrix[0,1] = 2.0
matrix[1,1] = 3.0
matrix[1,2] = 4.0
//matrix[2,3] = 5.0 报错,下标越界
matrix.toString()

程序运行结果如下图所示。

示例代码

https://github.com/99ios/23.14