Swift-下标脚本

参考:菜鸟教程

下标脚本可以定义在类(Class)、结构体(structure)和枚举(enmueration)这些目标中,可以认为是访问对象、集合或序列的快捷方式,不需要再调用实例的特定的赋值和访问方法。举例来说,用下标脚本访问一个数组(Array)实例中的元素可以这样写someArray[index],访问字典(Dictionary)实例中的元素可以这样写someDictionary[key]。
对于同一个目标可以定义多个下标脚本,通过索引值类型的不同来进行重载,而且索引值的个数可以是多个

subscripts(下标):访问对象中数据的快捷方式,所谓下标脚本语法就是通过实例[索引值]来访问实例中的数据,类似于以前访问数组和字典,其实Swift中的数组和字典就是一个结构体

1
2
3
4
Array:      subscripts(index: Int) -> T
Dictionary: subscripts(key: Key) -> value?
arr[0] == arr.subscripts(0)
dict["key"] == dict.scbscripts("key")

语法:

1
2
3
4
5
6
7
8
subscripts(index:Int) -> Int{
get{
// 同于下标脚本值的声明
}
set{
// 执行赋值操作
}
}

🌰🌰🌰

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
struct StudentStruct {
var name:String = "daisuek"
var math = 99.9
var chinese = 100.0
var english = 99.0

func score(course:String) -> Double? {
switch course {
case "math":
return math
case "chinese":
return chinese
case "english":
return english
default:
return 0.0
}
}

/*
1、想要实现下标访问,必须实现subscripts方法
2、如果想要通过下标访问,必须实现get方法
3、如果想要通过下标赋值,必须实现set方法
*/

subscript(course:String) ->Double?{
get{
switch course {
case "math":
return math
case "chinese":
return chinese
case "english":
return english
default:
return 0.0
}
}
set{
switch course {
case "math":
// 因为返回的是可选类型
math = newValue!
case "chinese":
chinese = newValue!
case "english":
english = newValue!
default:
print("not found")
}
}
}
}

class TestViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()

// Do any additional setup after loading the view.
var stu = StudentStruct(name: "daisuke", math: 94.5, chinese: 100.0, english: 99.0)
print(stu.score(course: "math")!)
// 通过下标赋值
stu["chinese"] = 150.0;
// 通过下标访问值
print(stu["chinese"]!)

}
}

很多人可能看到newValue很懵逼,我也是,都没有看到这个属性或者说没有这个参数,这个是怎么出现的呢?
关键在于set方法,如果set方法没有自定义参数名称,那么newValue是默认提供的。相反,你自定义了参数名称,newValue就不会出现。我们可以把set方法写成这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
set(valueParam){
switch course {
case "math":
// 因为返回的是可选类型
math = valueParam!
case "chinese":
chinese = valueParam!
case "english":
english = valueParam!
default:
print("not found")
}
}

多索引下标

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct Mulit {
subscript(a:Int, b:Int) -> Int{
get{
return a * b
}
}
}

class TestViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()

let mul = Mulit()
print(mul[3,4])
// 12
}