- 下標(biāo)(subscript)在數(shù)組和字典中使用笔呀,但是你可以給任何類型(枚舉幢踏,結(jié)構(gòu)體,類)增加 下標(biāo)subscript 的功能许师;
- subscript的語法類似實(shí)例方法房蝉、計(jì)算屬性,其本質(zhì)就是方法微渠;
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 可以接受多個(gè)參數(shù)敛助,并且是任意類型粗卜;
- 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 可以設(shè)置參數(shù)標(biāo)簽焕数;
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
類和結(jié)構(gòu)體作為返回值對(duì)比
類:
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
結(jié)構(gòu)體:
可以看出作為只讀(get)返回值時(shí),結(jié)構(gòu)體是不可修改的堡赔,因?yàn)榻Y(jié)構(gòu)體的內(nèi)存不可變识脆;
接收多個(gè)參數(shù)的下標(biāo)
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