类、结构体和枚举可以定义下标,它可以作为访问集合、列表或序列成员元素的快捷方式。你可使用下标通过索 引值来设置或检索值而不需要为设置和检索分别使用实例方法。比如说,用 someArray[index] 来访问 Array 实例 中的元素以及用 someDictionary[key] 访问 Dictionary 实例中的元素。
你可以为一个类型定义多个下标,并且下标会基于传入的索引值的类型选择合适的下标重载使用。下标没有限制 单个维度,你可以使用多个输入形参来定义下标以满足自定义类型的需求。
一、下标的语法
使用关键字 **subscript **来定义下标,并且指定一个或多个输入形式参数和返回类型,与实例方法一样。
与实例方法不同的是,下标可以是读写也可以是只读的。这个行为通过与计算属性中相同的 getter和setter传达:
1 subscript(index:Int) -> Int {
2 get{
3 //return an appropriate subscript value here
4 }
5 set(newValue){
6 //perform a suitable setting action here
7 }
8 }
下面是一个只读下标实现的栗子,它定义了一个 TimeTable 结构体来表示整数的n倍表:
1 struct TimesTable {
2 let multiplier: Int
3 subscript(index: Int) -> Int {
4 return multiplier * index
5 }
6 }
7 let threeTimesTable = TimesTable(multiplier: 3)
8 print("six times three is \(threeTimesTable[6])")
9 // prints "six times three is 18"
在这个栗子中,创建了一个 TimeTable 的新实例来表示三倍表。它表示通过给结构体的 initializer 转入值 3 来作为 用于实例的 multiplier 形式参数。
二、下标用法
“下标”确切的意思取决于它使用的上下文。通常下标是用来访问集合、列表或序列中元素的快捷方式。你可以在 你自己特定的类或结构体中自由实现下标来提供合适的功能。
例如,Swift 的 Dictionary 类型实现了下标来对 Dictionary 实例中存放的值进行设置和读取操作。你可以在下标的 方括号中通过提供字典键类型相同的键来设置字典里的值,并且把一个与字典值类型相同的值赋给这个下标:
1 var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
2 numberOfLegs["bird"] = 2
三、下标选项
下标可以接收任意数量的输入形式参数,并且这些输入形式参数可以是任意类型。下标也可以返回任意类型。
下标可以使用变量形式参数和可变形式参数,但是不能使用输入输出形式参数或提供默认形式参数值。
类或结构体可以根据自身需要提供多个下标实现,合适被使用的下标会基于值类型或者使用下标时下标方括号里 包含的值来推断。这个对多下标的定义就是所谓的下标重载。
网友评论