Swift學習筆記 二十一 下標

2021-09-26 01:23:06 字數 4198 閱讀 6390

下標可以定義在類、結構體和列舉中,是訪問集合、列表或序列中元素的快捷方式。可以使用下標的索引,設定和獲取值,而不

需要再呼叫對應的訪問方法。舉例來說,⽤下標訪問乙個 array 實例中的元素可以寫作 somearray[index] ,訪問 dictionary 實例

中的元素可以寫作 somedictionary[key] 。 乙個型別可以定義多個下標,通過不同索引型別進⾏過載。下標不限於一維,你可以

定義具有多個入參的下標滿足自定義型別的需求。

下標允許你通過在實例名稱後面的方括號中傳入乙個或者多個索引值來對實例進⾏訪問。語法類似於實例方法語法和計算型屬性

語法的混合。與定義實例方法類似,定義下標使用 subscript 關鍵字,指定乙個或多個輸入引數和返回型別;與實例⽅法不同的

是,下標可以設定為讀寫或唯讀。這種⾏為由 getter 和 setter 實現,有點類似計算型屬性:

subscript(index: int) -> int

let threetimestable = timestable(multiplier: 3)

print("six times three is \(threetimestable[6])")

// 列印「six times three is 18」

在上例中,建立了乙個 timestable 實例,⽤來表示整數 3 的乘法表。數值 3 被傳遞給結構體的建構函式,作為實例成員 

multiplier 的值。

你可以通過下標訪問 threetimestable 實例,例如上面演示的 threetimestable[6] 。這條語句查詢了 3 的乘法表中的第六個元

素,返回 3 的 6 倍即 18 。

timestable 例子基於乙個固定的數學公式,對 threetimestable[someindex] 進⾏賦值操作並不合適,因此下標定義為唯讀的。

下標的確切含義取決於使用場景。下標通常作為訪問集合,列表或序列中元素的快捷方式。你可以針對⾃己特定的類或結構體的功

能來自由地以最恰當的方式實現下標。

例如,swift 的 dictionary 型別實現下標用於對其實例中儲存的值進⾏訪問操作。為字典設值時,在下標中使用和字典的鍵型別

相同的鍵,並把乙個和字典的值型別相同的值賦給這個下標:

var numberoflegs = ["spider": 8, "ant": 6, "cat": 4]

numberoflegs["bird"] = 2

上例定義乙個名為 numberoflegs 的變量,並⽤乙個包含三對鍵值的字典字面量初始化它。 numberoflegs 字典的型別被推斷為 

[string: int] 。字典建立完成後,該例子通過下標將 string 型別的鍵 bird 和 int 型別的值 2 新增到字典中。

swift 的 dictionary 型別的下標接受並返回可選型別的值。上例中的 numberoflegs 字典通過下標返回的是乙個 int?或者說「可

選的 int」。dictionary 型別之所以如此實現下標,是因為不是每個鍵都有個對應的值,同時這也提供了一種通過鍵刪除對應值的

⽅式,只需將鍵對應的值賦值為 nil 即可。

下標可以接受任意數量的入參,並且這些入參可以是任意型別。下標的返回值也可以是任意型別。下標可以使用可變引數,並且可

以提供預設引數數值,但是不能使用輸入輸出引數。

⼀個類或結構體可以根據⾃身需要提供多個下標實現,使用下標時將通過入參的數量和型別進⾏區分,自動匹配合適的下標,這就

是下標的過載。

雖然接受單一⼊參的下標是最常見的,但也可以根據情況定義接受多個入參的下標。例如下例定義了乙個 matrix 結構體,用於表

示乙個 double 型別的二維矩陣。 matrix 結構體的下標接受兩個整型引數:

struct matrix

func indexisvalid(row: int, column: int) -> bool

subscript(row: int, column: int) -> double

set {

assert(indexisvalid(row: row, column: column), "index out of range")

grid[(row * columns) + column] = newvalue

matrix 提供了乙個接受兩個入參的構造方法,入參分別是 rows 和 columns ,建立了乙個足夠容納 rows * columns 個 double 類

型的值的陣列。通過傳入陣列長度和初始值 0.0 到陣列的構造器,將矩陣中每個位置的值初始化為 0.0 。關於陣列的這種構造方

法請參考 《建立乙個帶有預設值的陣列》。

你可以通過傳入合適的 row 和 column 的數量來構造乙個新的 matrix 實例:

var matrix = matrix(rows: 2, columns: 2)

上例中建立了乙個 matrix 實例來表示兩⾏兩列的矩陣。該 matrix 實例的 grid 陣列按照從左上到右下的閱讀順序將矩陣扁平化存

儲:

將 row 和 column 的值傳入下標來為矩陣設值,下標的入參使用逗號分隔:

matrix[0, 1] = 1.5

matrix[1, 0] = 3.2

上⾯兩條語句分別呼叫下標的 setter 將矩陣右上⻆位置(即 row 為 0 、 column 為 1 的位置)的值設定為1.5 ,將矩陣左下角位置

(即 row 為 1 、 column 為 0 的位置)的值設定為 3.2 :

matrix 下標的 getter 和 setter 中都含有斷言,用來檢查下標入參 row 和 column 的值是否有效。為了方便進⾏斷⾔, matrix 包含了乙個名為 indexisvalid(row:column:) 的便利方法,用來檢查入參 row 和 column 的值是否在矩陣範圍內:

func indexisvalid(row: int, column: int) -> bool {

return row >= 0 && row < rows && column >= 0 && column < columns

斷言在下標越界時觸發:

let somevalue = matrix[2, 2]

// 斷言將會觸發,因為 [2, 2] 已經超過了 matrix 的範圍

正如上節所述,例項下標是在特定型別的乙個實例上呼叫的下標。你也可以定義一種在這個型別本身上呼叫的下標。這種下標的

型別被稱作型別下標。你可以通過在 subscript 關鍵字之前寫下 static 關鍵字的方式來表示乙個型別下標。類可以使用 class 關

鍵字來允許子類重寫⽗類中對那個下標的實現。下面的例子展示了如何定義和調⽤乙個型別下標:

enum planet: int {

case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune

static subscript(n: int) -> planet {

return planet(rawvalue: n)!

let mars = planet[4]

print(mars)

注意:這個是5.1才有的功能

Swift 二十一 協議 1

1 swift入門學習筆記 第一版 對swift的基礎知識點進行梳理總結。知識點一直在變,只是作為參考,以蘋果官方文件為準 2 在學習完基本的知識點以後會結合官方文件及相關資料,在此版本的基礎上進行新增更改。類 結構體或列舉型別可遵循協議,並提供具體實現完成協議定義的方法和功能。除了遵循協議,我們也...

python 學習筆記(二十一)

coding utf8 author liwei windows平台多程序匯入multiprocessing模組 from multiprocessing import process,queue from multiprocessing import pool import os,time,ran...

Swift 學習之二十一 ?和 !(詳解)

swift語言使用var定義變數,但和別的語言不同,swift裡不會自動給變數賦初始值,也就是說變數不會有預設值,所以要求使用變數之前必須要對其初始化 如果在使用變數之前不進行初始化就會報錯 plain view plain copy print var stringvalue string err...