下标脚本可以定义在类、结构体和枚举中,即是访问集合、列表、学列的快捷方式,使用下标脚本的索引设置和获取值,不需要再调用实例特定的赋值和访问方法。
一、下标脚本语法
下标脚本允许通过实例方法后面的方括号传入一个或多个的索引值来对实例进行访问和赋值。语法类似于实例方法和计算属性的混合。与定义实例方法类似,定义下标脚本使用subscript
关键字,显式声明入参和返回类型。与实例方法不同的是下标脚本可以设定为读写或只读,而这种方式类似计算属性的getter和setter:
class Student {
// 学号
var studentNumber:Int = 0;
// 下标脚本
subscript(index:Int) ->Int {
get {
// 返回与入参匹配的Int类型值
// 例如学号: 11060101xxx
return (11_060_101_000 + studentNumber);
}
set(newValue) { // newValue是默认的,也可以省略不写
// 执行赋值操作
studentNumber = newValue;
}
}
}
// 实例化
let student = Student();
// 下标脚本 - set
student[3] = 3;
// 下标脚本 - get
print("学号:\(student[3])");
输出结果:
学号:11060101003
二、下标脚本用法
例如,swift中字典的实现通过下标脚本来对其实例中存放的值进行存取操作。在下标脚本中使用和字典的索引类型的值,并把一个字典类型的值赋值给这个下标脚本:
var dict = ["num1":3, "num2":4, "num3":5, "num4":6, "num5":7];
// 设置字典的值
dict["num3"] = 13;
print(dict["num3"]!);
输出结果:
13
swift中字典的脚本实现中,在
get
部分返回值的可选类型的。例如上面代码,返回值是Int?
,不是每个字典的索引都能得到一个整形值,对于没有设置值的索引访问返回的结果是nil
,同样想删除字典中的某个索引对应的值,只需要给索引赋值为nil
即可。
三、下标脚本选项
下标脚本允许任意数量的入参索引,并每个入参类型没有限制。类或结构体可以根据自身需要提供多个下标脚本实现,在定义下标脚本时通过入参的类型进行区分,使用下标脚本时会自动匹配合适的下标脚本运行,这即是下标脚本的重载:
/**
实现功能: 传入两个参数以及操作
*/
// 加减乘除枚举
enum ArithmeticSign {
// 对应加减乘除
case Add, Subtract, Multiply, Divide;
}
// 计算类
class ComputeClass {
var value:Double = 0.0;
// 计算方法
func compute(num1:Double, num2:Double, sign:ArithmeticSign) -> Double {
switch sign {
case .Add:
value = num1 + num2;
case .Subtract:
value = num1 - num2;
case .Multiply:
value = num1 * num2;
case .Divide:
value = num1 / num2;
}
return value;
}
// 下标脚本
subscript(num1:Double, num2:Double, sign:ArithmeticSign) -> Double {
get {
value = compute(num1, num2: num2, sign: sign);
return value;
}
}
}
// 实例对象
let compute = ComputeClass();
// 通过下标脚本获取获取对应的值
print("1 + 2 = \(compute[1,2,ArithmeticSign.Add])");
print("3 * 3 = \(compute[3,3,ArithmeticSign.Multiply])");
输出结果:
1 + 2 = 3.0
3 * 3 = 9.0