理解难度
★★★☆☆
实用程度
★★☆☆☆
下标(subscript)是一个可以快速存取及设置值的方式,单看中文字面上可能不太清楚什么意思。其实在前面介绍数组(array)及字典(dictionary)时已经有接触过,在数组或字典名称后面紧接着中括号[ ],括号内填入数组的索引值(index)或是字典的键(key),即可存取或设置值,以下是个例子:
// 声明一个 [Int] 类型的数组
var arr = [1,2,3,4,5,6,7]
// 打印出其内第三个元素(请记得 数组的索引值是从 0 开始算起)
print(arr[2])
// 修改第四个元素为 12
arr[3] = 12
// 声明一个 [String:String] 类型的字典
var dict = ["name":"Kevin","city":"Taipei"]
// 打印出键为 name 的值
print(dict["name"]!)
// 修改键为 city 的值为 New York
dict["city"] = "New York"
下标语法
下标也可以定义在类(class)、结构体(structure)及列举(enumeration)中,方式如下:
subscript(索引值: 索引值类型) -> 返回值类型 {
get {
// 存取值的代码操作
// 必须返回一个前面定义的类型的值
}
set(新设置值的名称) {
// 设置值的代码操作
}
}
与前面介绍过的计算型属性相似,可以定义为读写(getter及setter),也可以定义为唯读(getter)。setter传入的设置值名称也可以省略,省略时会有一个内建预设的名称newValue。这两种方式定义如下:
// 当下标为唯读时 可以将 get 关键字及大括号 {} 省略掉 如下
subscript(索引值: 索引值类型) -> 返回值类型 {
// 存取值的代码操作
// 必须返回一个前面定义的类型的值
}
// 省略 setter 传入的设置值名称 会有一个内建预设名称 newValue
subscript(索引值: 索引值类型) -> 返回值类型 {
get {
}
set{
// 设置值的代码操作
// 可使用 newValue 来操作
}
}
实例 1
struct subexample {
let decrementer: Int
subscript(index: Int) -> Int {
return decrementer / index
}
}
let division = subexample(decrementer: 100)
print("100 除以 9 等于 \(division[9])")
print("100 除以 2 等于 \(division[2])")
print("100 除以 3 等于 \(division[3])")
print("100 除以 5 等于 \(division[5])")
print("100 除以 7 等于 \(division[7])")
在上例中,通过 subexample 结构体创建了一个除法运算的实例。数值 100 作为结构体构造函数传入参数初始化实例成员 decrementer。
你可以通过下标脚本来得到结果,比如 division[2] 即为 100 除以 2。
下标用法
下面是在一个类中定义下标的例子:
// 定义一个简单数学算式功能的类别
class SimpleMath {
// 一个数字属性预设值
var num = 500
// 定义一个下标 为乘法
subscript(times: String) -> Int {
get {
// 其内可以使用这个索引值
print(times)
// 会返回 数字属性乘以 2 的数值
return num * 2
}
set {
// 将数字属性乘以新的倍数
num *= newValue
}
}
// 定义另一个下标 为除法
subscript(divided: Int) -> Int {
return num / divided
}
}
// 声明一个类别 SimpleMath 的常数
let oneMath = SimpleMath()
// 打印出:1000
print(oneMath["simple"])
// 传入值为 3, 会将数字属性乘以 3
oneMath["star"] = 3
// 这个下标例子中的字串索引值没有被使用到
// 其实是可以依照传入的索引值 来做不同的需求及返回值
// 打印出:1500
print(oneMath.num)
// 使用到另一个下标 索引值类型为 Int
// 打印出:15
print(oneMath[100])
下标可以定义多个索引值,可以是任意类型的参数或可变数量参数,返回值也可以是任意类型,但不能使用输入输出参数(inout),也不能给参数设置预设值。
如上述代码,类别或结构体可以定义多个下标,使用下标时会依据索引值数量及类型,自动推断使用合适的下标。