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