/*
下标脚本 可以定义在类(Class)、结构体(structure)和枚举(enumeration)这些目标中,
可以认为是访问集合(collection),列表(list)或序列(sequence的快捷方式,使用下标脚本的索引设置和获取值,
不需要再调用实例的特定的赋值和访问方法。 像数组someArray[index],字典someDirectionary[key]一样。
对于同一个目标可以定义多个下标脚本,通过索引值类型的不同来进行重载,下标脚本不限于单个纬度,
你可以定义多个入参的下标脚本满足自定义类型的需求。
定义下标脚本使用subscript关键字,显式声明入参(一个或多个)和返回类型。
与实例方法不同的是下标脚本可以设定为读写或只读。这种方式又有点像计算型属性的getter和setter:
subscript(index:Int) -> Int {
get {
// 返回与入参匹配的Int类型的值
}
set(newValue) {
// 执行赋值操作
}
}
newValue的类型必须和下标脚本定义的返回类型相同。与计算型属性相同的是set的入参声明newValue就算不写,
在set代码块中依然可以使用默认的newValue这个变量来访问新赋的值。
与只读计算型属性一样,可以直接将原本应该写在get代码块中的代码写在subscript中:
“get{}”省略不写
subscript(index: Int) -> Int {
// 返回与入参匹配的Int类型的值
}
*/
struct TimesTable {
let multiplier:Int
subscript(index:Int) -> Int {
return multiplier * index
}
}
let threeTimesTable = TimesTable(multiplier: 3)
print("3的6倍是 \(threeTimesTable[6])")
//3的6倍是 18
/*
下标脚本用法
根据使用场景不同下标脚本也具有不同的含义。通常下标脚本是用来访问集合(collection),
列表(list)或序列(sequence)中元素的快捷方式。你可以在你自己特定的类或结构体中自由的实现下标脚本来提供合适的功能。
*/
//定义矩阵
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)
}
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
matrix[1,0] = 3.2
print(matrix.grid)//[0.0, 1.5, 3.2, 0.0]
//let someValue = matrix[2,2]
//print(someValue) //下标越界 抛出错误
//脚本重载的例子,通过不同的参数来区分
struct CountNum {
var row:Int, col:Int
subscript(num:Int) ->Int {
return row + col + num
}
// 重载
subscript(num:Int, repeatCount:Int) -> Int {
return (row + col + num ) * repeatCount
}
}
var someCount = CountNum(row: 5, col: 5)
print(someCount[2]) //12
print(someCount[2,10]) //120