下标可以定义在类、结构体和枚举中,是访问集合、列表、序列中元素的快捷方式。可以使用下标的索引,设置和获取值,而不需要再调用对应的存取方法。如数组:someArray[index]
一个类型可以定义多个下标,通过不同索引类型进行对应的重载。下标不限于一维,你可以定义具有多个入参的下标满足自定义类型的需求。
关键字subscript
使用subscript
可以给任意类型(枚举、结构体、类)增加下标功能。下标允许你通过在实例名称后面的[ ]
中传入一个或者多个索引值来对实例进行查询。下标可以设定为读写或只读,这种行为由 getter 和 setter 实现。
subscript的本质就是方法(函数),语法类似于实例方法、计算属性。
- 定义下标
class Point {
var x = 0.0, y = 0.0
// 定义下标,这样实例后面就可以加[]了
subscript(index: Int) -> Double {
set {
if index == 0 {
x = newValue
} else if index == 1 {
y = newValue
}
}
get {
if index == 0 {
return x
} else if index == 1 {
return y
}
return 0
}
}
}
如同只读计算型属性,对于只读下标的声明,你可以通过省略 get 关键字和对应的大括号组来进行简写:
subscript(index: Int) -> Int {
// 返回一个适当的 Int 类型的值
}
- 使用下标功能,方便设置or取 属性值
对于定义了subscript
,通过给类或者实例添加[ ]
(类似数组)并传入subscript
的参数,即可调用下标。
var p = Point() // 创建实例
p[0] = 11.1 // 实例后直接加 [],
p[1] = 22.2
print(p.x) // 11.1
print(p.y) // 22.2
print(p[0]) // 11.1
print(p[1]) // 22.2
下标也可以是类方法
class Sum {
// 这里:设有两个索引
static subscript(v1: Int, v2: Int) -> Int {
return v1 + v2
}
}
print(Sum[10, 20]) // 30
subscript中定义的返回值类型决定了:
get
方法的返回值类型,及set
方法中newValue
的类型。
subscript可以接受多个参数,并且类型任意
subscript可以没有set
,但必须要有get
如果只有get
,可以省略get