1.简介
下标脚本可以定义在类,结构体,枚举这些目标中
可以通过索引快捷地获取值
var a: Array<Int> = [1,2,3,4,5]
print(a[0])
a[3] = 23
print(a[3])
var dic: Dictionary<Int,String> = [1:"tom",2:"kite",3:"rose"]
print(dic[2])
2.自定义下标脚本的语法
struct SomeStruct {
var a:Int
subscript(index:Int)->Int{
get{
return index*a
}
set{
a=newValue*index
}
}
}
var s = SomeStruct(a: 5)
print(s[3])//get取值
s[5] = 6//set赋值
print(s.a)
print(s[5])//重新取值
//只读.只有get没有set
struct SomeStruct {
var a: Int
subscript(index:Int)->Int{
// get{
// return index*a
// }
return index*a
}
}
var s = SomeStruct(a: 2)
print(s[2])
3.小标脚本的用法
var dic:Dictionary<Int,String> = [1:"tom",2:"kite",3:"rose"]
print(dic[1]!)
dic[2] = "jack"
print(dic[2]!)
4.下标脚本选项
下标脚本允许任意数量的入参索引,并且入参类型没有限制。返回值可以是任意类型,可以使用变量参数和可变参数,但使用写入读出(inout)参数或者给参数设置默认值都是不允许的。一个类或者结构体可以根据自身需要提供多个下标脚本实现,在定义时通过入参的类型进行区分,使用下标脚本时会自动匹配合适的下标脚本实现运行,这就是下标脚本的重载。
5.实例
用行列表操作一维数组
struct Matrix{
let rows:Int,columns:Int//定义行数列数
var grid: [Double]//定义网格,网格是一个数组
init(rows: Int,columns: Int){
self.rows = rows
self.columns = columns
self.grid = Array(count: rows*columns, repeatedValue: 5.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")//评估行列是否有效,无效则输出"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 m = Matrix(rows: 3, columns: 3)
m[2,1] = 6
print(m.grid)
m.grid[4] = 8
print(m.grid)