在Swift中,如果想像数组或者字典那样通过中括号加值的方式访问一组数据中的某一个的数据的话,可以通过subscript下标索引的方式来访问数据。所以,下标就是访问对象中数据的快捷方式,能够通过 对象[索引值] 的方式来访问实例中的值。数组和字典就是典型的用下标语法来访问实例中的值的例子。
同一个类、结构体或枚举可以定义多个下标,通过索引值类型的不同来进行重载,而且索引值的个数可以是多个。下标允许任意数量的形参索引,并且每个形参类型也没有限制。下标的返回值也可以是任何类型。下标可以使用可变参数,但使用输入输出参数或给参数设置默认值都是不允许的。
下面介绍一个很适合下标索引的例子:(通过行和列来访问矩阵元素)
struct Matrix {
let rows: Int
let cols: Int
var grid: [Double]
//初始化方法
init(rows: Int, cols: Int) {
self.rows = rows
self.cols = cols
grid = Array(repeating: 0.0, count: rows*cols)
}
//判断索引是否合法
func indexIsValidForRowAndColumn(row: Int, col: Int) -> Bool {
return row >= 0 && row < rows && col >= 0 && col < cols
}
//下标索引
subscript(row: Int, col: Int) -> Double {
get {
if(indexIsValidForRowAndColumn(row: row, col: col)) {
return grid[(row * cols) + col]
} else {
print("下标越界")
return 0
}
}
set {
if(indexIsValidForRowAndColumn(row: row, col: col)) {
grid[(row * cols) + col] = newValue
} else {
print("下标越界")
}
}
}
//输出
func show() {
for i in 0..<rows {
for j in 0..<cols {
print(grid[(i * cols) + j], terminator: " ")
}
print("")
}
}
}
var matrix = Matrix(rows: 3, cols: 3)
matrix.show()
print("-----------")
matrix[1, 1] = 2
matrix[2, 0] = 1
matrix.show()
print("-----------")
print(matrix[2, 0])
输出结果如下: