官方定义:
下标可以定义在类、结构体和枚举中,是访问集合、列表或序列中元素的快捷方式。可以使用下标的索引,设置和获取值,而不需要再调用对应的存取方法。
下标允许你通过在实例名称后面的方括号中传入一个或者多个索引值来对实例进行查询。它的语法类似于实例方法语法和计算型属性语法。定义下标使用 subscript 关键字,与定义实例方法类似,都是指定一个或多个输入参数和一个返回类型。与实例方法不同的是,下标可以设定为读写或只读。
下标语法:
override func viewDidLoad() {
struct TimesTable {
let multiplier: Int
subscript(index: Int) -> Int {
return multiplier * index
}
}
let threeTimesTable = TimesTable(multiplier: 3)
print("6 乘 3 等于:\(threeTimesTable[6])")
// 打印 “6 乘 3 等于:18”
}
在上例中,创建了一个 TimesTable 实例,用来表示整数 3 的乘法表。数值 3 被传递给结构体的构造函数,作为实例成员 multiplier 的值。通过下标访问 threeTimesTable 实例,例如上面演示的 threeTimesTable[6]。这条语句查询了乘法表中 3 的第六个元素,返回 6 乘 3 等于18。
根据使用场景不同下标脚本也具有不同的含义。通常下标脚本是用来访问集合,列表或序列中元素的快捷方式。例如,Swift
的字典(Dictionary)实现了通过下标脚本对其实例中存放的值进行存取操作。在下标脚本中使用和字典索引相同类型的值,并且把一个字典值类型的值赋值给这个下标脚来为字典设值:
var abc = ["a": 1, "b": 2]
abc["c"] = 3
print(abc)
// 打印“["a": 1, "c": 3, "b": 2]“
下标选项:
下标可以接受任意数量的入参,并且这些入参可以是任何类型。下标的返回值也可以是任意类型。
一个类或结构体可以根据自身需要提供多个下标实现,使用下标时将通过入参的数量和类型进行区分,自动匹配合适的下标。它通常被称为下标的重载。
override func viewDidLoad() {
struct Matrix {
let rows: Int, columns: Int
var print: [Double]
init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns
print = Array(repeating: 0.0, count: rows * columns)
}
subscript(row: Int, column: Int) -> Double {
get {
return print[(row * columns) + column]
}
set {
print[(row * columns) + column] = newValue
}
}
}
// 创建了一个新的 2 行 2 列的Matrix实例
var mat = Matrix(rows: 2, columns: 2)
// 通过下标脚本设置值
mat[0,0] = 1.0
mat[0,1] = 2.0
mat[1,0] = 3.0
mat[1,1] = 4.0
// 通过下标脚本获取值
print("\(mat[0,0])") // 打印 "1.0"
print("\(mat[0,1])") // 打印 "2.0"
print("\(mat[1,0])") // 打印 "3.0"
print("\(mat[1,1])") // 打印 "4.0"
}
Matrix 提供了一个接受两个入参的构造方法,入参分别是 rows 和 columns,创建了一个足够容纳 rows * columns 个 Double 类型的值的数组。通过传入数组长度和初始值 0.0 到数组的构造器,将矩阵中每个位置的值初始化为 0.0