下标

下标可以定义在类、结构体和枚举中,用于访问集合、列表或序列中的元素

一个类型可以定义多个下标.通过不同索引类型进行重载.下标不限于一维

下标语法

通过在实例名称后的方括号中传入一个或多个索引值来对实例进行存取

定义下标使用subscript关键字,指定一个或者多个输入参数和返回类型
下标可以设置为读写或者只读,通过是getter或者setter实现

subscript(index: Int) -> Int {
    get {
        // 返回一个适当的 Int 类型的值
    }
    set(newValue) {
        // 执行适当的赋值操作
    }
}

可以不指定setter的参数,默认提供newValue

struct TimesTable {
    let multiplier: Int
    subscript(index: Int) -> Int {
        return multiplier * index
    }
}
let threeTimesTable = TimesTable(multiplier: 3)
print("six times three is \(threeTimesTable[6])")
// 打印 "six times three is 18"

定义一个数学公式结构体,只读的下标语法

下标用法

//字典的下标语法
var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
numberOfLegs["bird"] = 2

下标选项

下标可以接受任意数量的入参,并且这些入参可以是任意类型。下标的返回值也可以是任意类型。
下标可以使用可变参数,并且可以提供默认参数数值,但是不能使用输入输出参数。

一个类或者结构体可以根据自身需要提供多个下标实现,使用下标时将通过入参的数量和类型进行区分,自动匹配合适的下标,这就是下标的重载

下标的重载:
类和结构体可以根据自身需要提供多个下标实现,通过入参和类型进行区分

例如 根据情况定义多个入参的下标

struct Matrix {
    let rows: Int, columns: Int
    var grid: [Double]
    init(rows: Int, columns: Int) {
        self.rows = rows
        self.columns = columns
        //通过传入数组长度和初始值0.0到数组的构造器,将矩阵中每个位置的值初始化为0.0
        grid = Array(count: rows * columns, repeatedValue: 0.0)
    }
    func indexIsValidForRow(row: Int, column: Int) -> Bool {
        return row >= 0 && row < rows && column >= 0 && column < columns
    }
    subscript(row: Int, column: Int) -> Double {
        get {
            //断言语句
            assert(indexIsValidForRow(row, column: column), "Index out of range")
            return grid[(row * columns) + column]
        }
        set {
            //断言语句
            assert(indexIsValidForRow(row, column: column), "Index out of range")
            grid[(row * columns) + column] = newValue
        }
    }
}
var matrix = Matrix(rows: 2, columns: 2)
//下标入参用逗号进行分割
matrix[0, 1] = 1.5 //将下标为(0,1)位置设置为1.5

通过断言,检查下标入参rowcolum的值是否有效.定义方法indexIsValidForRow(_:column:)检查入参rowcolumu是否越界,断言会在下标月结

类型下标

前面说的都是实例下标,是在特定实例上调用的下标。当然也可以定义在类型本身调用的下标即类型下标

通过正在subscript关键字前写static关键字来表示类型下标。

对于类可以使用class关键字来允许子类重写父类对下标的实现。

enum Planet: Int {
    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
    static subscript(n: Int) -> Planet {
        return Planet(rawValue: n)!
    }
}
let mars = Planet[4]
print(mars)