Swift程式設計十三(下標)

2021-09-24 15:44:02 字數 3239 閱讀 1918

類,結構和列舉可以定義下標,下標是用於訪問集合,列表或序列的成員元素的快捷方式。可以使用下標按索引設定和檢索值,而無需單獨的設定和檢索方法。例如,可以使用somearray[index]在array例項中和使用somedictionary[key]在dictionary例項訪問元素。

可以為單個型別定義多個下標,並根據傳遞給下標的索引值的型別選擇要使用的相應下標過載。下標不限於單個維度,可以定義具有多個輸入引數的下標,以滿足自定義型別的需求。

可以通過下標在例項名稱後面的方括號中寫入乙個或多個值來查詢型別的例項。它們的語法類似於例項方法語法和計算屬性語法。使用subscript關鍵字編寫下標定義,並以與例項方法相同的方式指定乙個或多個輸入引數和返回型別。與例項方法不同,下標可以是讀寫或唯讀。此行為由getter和setter以與計算屬性相同的方式傳遞:

subscript(index: int) -> int 

set(newvalue)

}

newvalue型別與下標的返回值相同。與計算屬性一樣,可以選擇不指定setter的(newvalue)引數。newvalue如果沒有自己提供,則setter提供乙個預設引數。

與唯讀計算屬性一樣,可以通過刪除get關鍵字及其大括號來簡化唯讀下標的宣告:

subscript(index: int) -> int
這是乙個唯讀下標實現的示例,它定義了乙個timestable表示整數n倍數表的結構:

struct timestable 

}let threetimestable = timestable(multiplier: 3)

print(threetimestable[6])

在此示例中,timestable建立了乙個新例項來表示3的倍數表。這通過將3的值傳遞給結構初始化作為例項multiplier引數的值來表示。

可以通過呼叫threetimestable下標來查詢例項,如呼叫中所示threetimestable[6]。這將請求3的倍數表中的第六個條目,該錶返回值18或3的6倍。

注意: 乙個倍數表是基於乙個固定的數學規則。設定threetimestable[someindex]為新值是不合適的,因此timestable下標被定義為唯讀下標。

「下標」的確切含義取決於使用它的上下文。下標通常用作訪問集合,列表或序列中的成員元素的快捷方式。可以以最合適的方式為特定類或結構的功能實現下標。

例如,swift的dictionary型別實現了乙個下標來設定和檢索儲存在dictionary例項中的值。可以通過在下標括號中提供字典的鍵型別的鍵,並將字典的值型別的值分配給下標來設定字典中的值:

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

numberoflegs["bird"] = 2

上面的示例定義了乙個名為numberoflegs的變數,並使用包含三個鍵值對的字典文字對其進行初始化。numberoflegs推斷字典的型別是[string: int]。建立字典後,此示例使用下標分配向字典新增鍵string"bird"和值int2。

有關dictionary下標的詳細資訊,請參閱訪問和修改字典。

注意: swift的dictionary型別將其鍵值下標實現為獲取並返回可選型別的下標。對於上面的numberoflegs字典,鍵值下標採用並返回int?型別的值,或「optional int」型別。該dictionary型別使用可選的下標型別來模擬不是每個鍵都有值的事實,並通過為該鍵賦值為nil來刪除鍵的值提供一種方法。

下標可以採用任意數量的輸入引數,這些輸入引數可以是任何型別。下標也可以返回任何型別。下標可以使用可變引數,但它們不能使用輸入輸出引數或提供預設引數值。

類或結構可以根據需要提供盡可能多的下標實現,並且將基於在使用下標處括號內包含的值或值的型別來推斷要使用的適當下標。多個下標的這種定義稱為下標過載。

雖然下標採用單個引數是最常見的,但如果適合你的型別,也可以定義帶有多個引數的下標。以下示例定義了乙個matrix結構,該結構表示double值的二維矩陣。該matrix結構的下標有兩個整型引數:

struct matrix 

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

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

set }}

matrix提供了採用兩個稱為rows和columns引數的初始化方法,並建立乙個陣列,它是大到足以儲存rows * columns個double型別的值。矩陣中的每個位置都給出初始值0.0。為此,將陣列的大小和初始單元格值0.0傳遞給陣列初始值設定項,該陣列初始值設定項建立並初始化正確大小的新陣列。在建立具有預設值的陣列中更詳細地描述了此初始化程式。

可以通過將適當的行和列計數傳遞給matrix初始化設定項來構造新例項:

var matrix = matrix(rows: 2, columns: 2)
上面的示例建立了乙個matrix包含兩行和兩列的新例項。此matrix例項的陣列實際上是矩陣的扁平版本,從左上角到右下角讀取:

可以通過將行和列值傳遞到下標中來設定矩陣中的值,用逗號分隔:

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, colunm: int) -> bool
如果嘗試訪問矩陣邊界之外的下標,則會觸發斷言:

let somevalue = matrix[2, 2]

翻譯 Swift程式語言 下標

類 結構體和列舉可以使用下標,用來方便訪問乙個集合 列表或序列的成員。可以使用下標根據索引設定和獲取值,而不需要單獨的方法。舉例來說,你可以使用somearray index 來訪問乙個陣列的例項中的元素,也可以使用somedictionary key 來訪問乙個字典中的元素。可以定義單一型別的多個...

Swift 下標指令碼

playground noun a place where people can play import uikit var str hello,playground 下標指令碼語法 下標指令碼允許你通過在例項後面的方括號中傳入乙個或者多個的索引值來對例項進行訪問和賦值。語法類似於例項方法和計算型屬...

Swift 下標專題

import foundation struct vector3 set函式 set var v vector3 v 0 v 0 1import foundation class matrix subscript x int,y int double set 如果想和c語言中的二維陣列保持一致,即可...