下标语法概念:
类和结构体以及枚举能够声明下标快捷访问集合中的成员。例如数组someArray[index]或者字典someDictionary[key]可以通过下标检索和设置对应下标的成员的值。下标可以查询一个类型的一个或多个写在实例名称后的方括号中的实例的值。如下所示:用subscript关键字来定义一个下标方法,里面有get和set两个方法。这种方式是通过同样的方式作为计算属性的getter和setter 。
subscript(index: Int) -> Int {
get {
// return an appropriate subscript value here
}
set(newValue) {
// perform a suitable setting action here
}
}```
newValue的类型和subscript的返回类型相同,如果你的set方法没有设置参数系统会默认有一个newValue参数
subscript(index: Int) -> Int {
// return an appropriate subscript value here
}```
下面定义一个TimesTable 结构体并声明一个subscript(下标)方法。返回值是multiplier 和 index的乘积。例如下面multiplier 的值是3,index的值是6,threeTimesTable[6]返回的值是18
struct TimesTable {
let multiplier: Int
subscript(index: Int) -> Int {
return multiplier * index
}
}
let threeTimesTable = TimesTable(multiplier: 3)
print("six times three is \(threeTimesTable[6])")
// Prints "six times three is 18"```
下面定义一个Matrix 结构体里面有int类型的rows和columns两个属性,以及一个存Double类型grid数组
struct Matrix {
let rows: Int, columns: Int
var grid: [Double]
init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns
grid = Array(count: rows * columns, repeatedValue: 0.0)//初始化一个grid 数组
}
func indexIsValidForRow(row: Int, column: Int) -> Bool {
return row >= 0 && row < rows && column >= 0 && column < columns
}//这个方法判断row和column是否满足要求
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//给对应下标的元素设置值
}
}
}```
//定义一个两行两列的Matrix
var matrix = Matrix(rows: 2, columns: 2)```

//通过下标设置matrix的grid数组对应的行列的元素值
matrix[0, 1] = 1.5
matrix[1, 0] = 3.2```

网友评论