- 作者: Liwx
- 郵箱: 1032282633@qq.com
- 源碼: 需要
源碼的同學(xué), 可以在評(píng)論區(qū)留下您的郵箱
iOS Swift 語法
底層原理與內(nèi)存管理分析 專題:【iOS Swift5語法】00 - 匯編
01 - 基礎(chǔ)語法
02 - 流程控制
03 - 函數(shù)
04 - 枚舉
05 - 可選項(xiàng)
06 - 結(jié)構(gòu)體和類
07 - 閉包
08 - 屬性
09 - 方法
10 - 下標(biāo)
11 - 繼承
12 - 初始化器init
13 - 可選項(xiàng)
目錄
- 01-下標(biāo)(subscript)
- 02-下標(biāo)的細(xì)節(jié)
- 03-結(jié)構(gòu)體、類作為返回值對(duì)比
- 04-接收多個(gè)參數(shù)的下標(biāo)
- 05-下標(biāo)默認(rèn)參數(shù)
01-下標(biāo)(subscript)
- 使用
subscript可以給任意類型(枚舉、結(jié)構(gòu)體、類)增加下標(biāo)功能,有些地方也翻譯為:下標(biāo)腳本-
subscript的語法類似于實(shí)例方法、計(jì)算屬性, 本質(zhì)就是方法(函數(shù))
-
class Point {
var x = 0.0, y = 0.0
subscript(index: Int) -> Double {
set {
if index == 0 {
x = newValue
} else if index == 1 {
y = newValue
}
}
get {
if index == 0 {
return x
} else if index == 1 {
return y
}
return 0
}
}
}
var p = Point()
p[0] = 11.1
p[1] = 22.2
print(p.x) // 11.1
print(p.y) // 22.2
print(p[0]) // 11.1
print(p[1]) // 22.2
-
subscript中定義的返回值類型決定了-
get方法的返回值類型 -
set方法中newValue的類型
-
-
subscript可以接受多個(gè)參數(shù),并且類型任意
02-下標(biāo)的細(xì)節(jié)
-
subscript可以沒有set方法,但必須要有get方法
class Point {
var x = 1.0, y = 2.0
subscript(index: Int) -> Double {
get {
if index == 0 {
return x
} else if index == 1 {
return y
}
return 0
}
}
}
let p = Point()
//p[0] = 10 // 沒有set方法不能修改, error: cannot assign through subscript: subscript is get-only
print(p[0])
- 如果只有
get方法,可以省略get
class Point {
var x = 1.0, y = 2.0
subscript(index: Int) -> Double {
if index == 0 {
return x
} else if index == 1 {
return y
}
return 0
}
}
let p = Point()
//p[0] = 10 // 沒有set方法不能修改, error: cannot assign through subscript: subscript is get-only
print(p[0])
- 可以設(shè)置
參數(shù)標(biāo)簽
class Point {
var x = 1.0, y = 2.0
subscript(index i: Int) -> Double {
if i == 0 {
return x
} else if i == 1 {
return y
}
return 0
}
}
let p = Point()
p.y = 22.2
//print(p[1]) // 如果有標(biāo)簽,必須加上標(biāo)簽 error: missing argument label 'index:' in subscript
print(p[index: 1]) // 22.2
- 下標(biāo)可以是
類型方法
class Sum {
static subscript(v1: Int, v2: Int) -> Int {
return v1 + v2
}
}
print(Sum[10, 20]) // 30
03-結(jié)構(gòu)體、類作為返回值對(duì)比
- 如果
下標(biāo)返回值是類,沒有set方法時(shí),可以直接修改屬性,因?yàn)?code>類實(shí)例對(duì)象存儲(chǔ)在堆空間
class Point {
var x = 0, y = 0
}
class PointManager {
var point = Point()
subscript(index: Int) -> Point {
get { point }
}
}
var pm = PointManager()
pm[0].x = 11
pm[0].y = 22
print(pm[0].x, pm[0].y) // 11 22
- 如果
下標(biāo)返回值是結(jié)構(gòu)體,沒有set方法時(shí),不可以直接修改屬性
struct Point {
var x = 0, y = 0
}
class PointManager {
var point = Point()
subscript(index: Int) -> Point {
set { point = newValue } // set方法
get { point }
}
}
var pm = PointManager()
pm[0].x = 11 // 如果沒有set方法, Cannot assign to property: subscript is get-only
// pm[0].x = 11 本質(zhì)是 pm[0]= Point(x: 11, y: pm[0].y)
pm[0].y = 22
print(pm[0].x, pm[0].y) // 11 22
04-接收多個(gè)參數(shù)的下標(biāo)
- 接收多個(gè)參數(shù)的下標(biāo)
class Grid {
var data = [
[0, 1, 2],
[3, 4, 5],
[6, 7, 8]
]
subscript(row: Int, column: Int) -> Int {
set {
guard row >= 0 && row < 3 && column >= 0 && column < 3 else {
return
}
data[row][column] = newValue
}
get {
guard row >= 0 && row < 3 && column >= 0 && column < 3 else {
return 0
}
return data[row][column]
}
}
}
var grid = Grid()
grid[0, 1] = 77
grid[1, 2] = 88
grid[2, 0] = 99
print(grid.data)
05-下標(biāo)默認(rèn)參數(shù)
-
Swift 5.2新增可以為自定義下標(biāo)時(shí)聲明默認(rèn)參數(shù)
class Grid {
var data = [
[0, 1, 2],
[3, 4, 5],
[6, 7, 8]
]
// column 設(shè)置默認(rèn)參數(shù)為0
subscript(row: Int, column: Int = 0) -> Int {
set {
guard row >= 0 && row < 3 && column >= 0 && column < 3 else {
return
}
data[row][column] = newValue
}
get {
guard row >= 0 && row < 3 && column >= 0 && column < 3 else {
return 0
}
return data[row][column]
}
}
}
var grid = Grid()
grid[0, 1] = 77
grid[1, 2] = 88
grid[2, 0] = 99
print(grid.data)
grid[1] // 3, 相當(dāng)于grid[1, 0]
iOS Swift 語法
底層原理與內(nèi)存管理分析 專題:【iOS Swift5語法】