- 下标(subscript)在数组和字典中使用,但是你可以给任何类型(枚举,结构体,类)增加 下标subscript 的功能;
- subscript的语法类似实例方法、计算属性,其本质就是方法;
struct Person {
var age = 0
var no = 0
subscript(index: Int) -> Int {
set {
if index == 0 {
age = newValue
} else {
no = newValue
}
}
get {
if index == 0 {
return age
} else {
return no
}
}
}
}
var p = Person()
p[0] = 10
p[1] = 20
print(p.age) // 10
print(p[0]) // 10
print(p.no) // 20
print(p[1]) // 20
-
subscript 的返回值类型决定了:
- get 方法的返回值类型;
- set 方法中 newValue 的类型;
- subscript 可以接受多个参数,并且是任意类型;
- subscript 可以没有 set 方法,但必须要有 get 方法;
- 如果只有 get 方法,可以省略;
struct Person {
var age = 30
subscript(index: Int) -> Int {
if index == 0 {
return age
} else {
return age * 2
}
}
}
var p = Person()
print(p[0]) // 30
print(p[1]) // 60
- subscript 可以设置参数标签;
struct Person {
var age = 30
subscript(index i: Int) -> Int {
if i == 0 {
return age
} else {
return age * 2
}
}
}
var p = Person()
print(p[index:0]) // 30
print(p[index:1]) // 60
- subscript 可以是类型方法;
struct Person {
static subscript(index i: Int) -> Int {
if i == 0 {
return 30
} else {
return 60
}
}
}
print(Person[index:0]) // 30
print(Person[index:1]) // 60
类和结构体作为返回值对比
类:
class Point {
var x = 0
var y = 0
}
class PointM {
var point = Point()
subscript(index: Int) -> Point {
get {
return point
}
}
}
var pm = PointM()
pm[0].x = 10
pm[0].y = 20
print(pm[0].x) // 10
print(pm[0].y) // 20
结构体:
可以看出作为只读(get)返回值时,结构体是不可修改的,因为结构体的内存不可变;
接收多个参数的下标
class Matix {
var data = [
[1,0,0],
[0,1,0],
[0,0,1]
]
subscript(row: Int , col: Int) -> Int {
set {
guard row >= 0 && row < 3 && col >= 0 && col < 3 else {
return
}
data[row][col] = newValue
}
get {
guard row >= 0 && row < 3 && col >= 0 && col < 3 else {
return 0
}
return data[row][col]
}
}
}
var m = Matix()
m[1, 1] = 3
m[0, 1] = 4
源代码demo