- 作者: Liwx
- 郵箱: 1032282633@qq.com
- 源碼: 需要
源碼
的同學, 可以在評論區
留下您的郵箱
iOS Swift 語法
底層原理
與內存管理
分析 專題:【iOS Swift5語法】00 - 匯編
01 - 基礎語法
02 - 流程控制
03 - 函數
04 - 枚舉
05 - 可選項
06 - 結構體和類
07 - 閉包
08 - 屬性
09 - 方法
10 - 下標
11 - 繼承
12 - 初始化器init
13 - 可選項
目錄
- 01-下標(subscript)
- 02-下標的細節
- 03-結構體、類作為返回值對比
- 04-接收多個參數的下標
- 05-下標默認參數
01-下標(subscript)
- 使用
subscript
可以給任意類型
(枚舉、結構體、類
)增加下標功能,有些地方也翻譯為:下標腳本
-
subscript
的語法類似于實例方法、計算屬性
, 本質就是方法(函數)
-
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
可以接受多個參數
,并且類型任意
02-下標的細節
-
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])
- 可以設置
參數標簽
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]) // 如果有標簽,必須加上標簽 error: missing argument label 'index:' in subscript
print(p[index: 1]) // 22.2
- 下標可以是
類型方法
class Sum {
static subscript(v1: Int, v2: Int) -> Int {
return v1 + v2
}
}
print(Sum[10, 20]) // 30
03-結構體、類作為返回值對比
- 如果
下標返回值是類
,沒有set方法
時,可以直接修改屬性
,因為類實例對象
存儲在堆空間
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
- 如果
下標返回值是結構體
,沒有set方法
時,不可以
直接修改屬性
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 本質是 pm[0]= Point(x: 11, y: pm[0].y)
pm[0].y = 22
print(pm[0].x, pm[0].y) // 11 22
04-接收多個參數的下標
- 接收多個參數的下標
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-下標默認參數
-
Swift 5.2
新增可以為自定義下標
時聲明默認參數
class Grid {
var data = [
[0, 1, 2],
[3, 4, 5],
[6, 7, 8]
]
// column 設置默認參數為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, 相當于grid[1, 0]
iOS Swift 語法
底層原理
與內存管理
分析 專題:【iOS Swift5語法】