繼續學習Swift文檔,從上一章節:方法,咱們學習了Swift方法相關的內容,如實例方法的定義和使用、mutating關鍵字的做用、類方法的定義和使用等這些內容。如今,咱們學習Swift的下標相關的內容。因爲篇幅較長,這裏分篇來記錄,接下來,Fighting!html
若是你已經熟悉這章節內容,請移步下一章節:繼承swift
類,結構體和枚舉能夠定義下標,這些下標是用於訪問集合,列表或序列的成員元素的快捷方式。 您能夠使用下標按索引設置和檢索值,而無需使用單獨的方法進行設置和檢索。 例如,您能夠將Array實例中的元素做爲someArray [index]訪問,並將Dictionary實例中的元素做爲someDictionary [key]訪問。數組
您能夠爲單個類型定義多個下標,而後根據傳遞給下標的索引值的類型選擇要使用的適當下標重載。 下標不限於單個維度,您能夠定義具備多個輸入參數的下標以知足您的自定義類型的需求。bash
經過下標,您能夠經過在實例名稱後的方括號中寫入一個或多個值來查詢類型的實例。 它們的語法與實例方法語法和計算屬性語法類似。 使用下標關鍵字編寫下標定義,並以與實例方法相同的方式指定一個或多個輸入參數和返回類型。 與實例方法不一樣,下標能夠是讀寫的或只讀的。 此行爲由getter和setter傳遞,其方式與計算屬性相同:app
subscript(index: Int) -> Int {
get {
// Return an appropriate subscript value here.
}
set(newValue) {
// Perform a suitable setting action here.
}
}
複製代碼
newValue的類型與下標的返回值相同。 與計算屬性同樣,您能夠選擇不指定設置者的(newValue)參數。 若是您本身沒有提供一個默認參數,名稱爲newValue則會提供給設置器。ide
與只讀計算屬性同樣,能夠經過刪除get關鍵字及其花括號來簡化只讀下標的聲明:函數
subscript(index: Int) -> Int {
// Return an appropriate subscript value here.
}
複製代碼
這是一個只讀下標實現的示例,該示例定義了一個TimesTable結構體來表示整數的n次表:post
struct TimesTable {
let multiplier: Int
subscript(index: Int) -> Int {
return multiplier * index
}
}
let threeTimesTable = TimesTable(multiplier: 3)
print("six times three is \(threeTimesTable[6])")
// Prints "six times three is 18"
複製代碼
在此示例中,建立了一個TimesTable的新實例來表示三倍表。 這是經過將值3傳遞給結構的初始值設定項來表示的,該值用於實例的multiplier參數。學習
您能夠經過調用下標來查詢threeTimesTable實例,如對threeTimesTable [6]的調用所示。 這將請求三倍表中的第六個條目,該表返回值18或3乘以6。ui
注意
n次表基於固定的數學規則。 將ThreeTimesTable [someIndex]設置爲新值是不合適的,所以TimesTable的下標定義爲只讀下標。
「下標」的確切含義取決於使用它的上下文。 下標一般用做訪問集合,列表或序列中的成員元素的快捷方式。 您能夠根據本身的特定類或結構體的功能,以最合適的方式自由實現下標。
例如,Swift的Dictionary類型實現下標以設置和檢索存儲在Dictionary實例中的值。 您能夠在字典中設置值,方法是在下標括號內提供字典的鍵類型的鍵,而後將字典的值類型的值分配給下標:
var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
numberOfLegs["bird"] = 2
複製代碼
上面的示例定義了一個名爲numberOfLegs的變量,並使用包含三個鍵值對的字典文字對其進行初始化。 numberOfLegs詞典的類型推斷爲[String:Int]。 建立字典後,此示例使用下標分配向字典添加String關鍵字「 bird」和Int值2。
有關字典下標的更多信息,請參見Accessing and Modifying a Dictionary。
Swift的Dictionary類型將其鍵值下標實現爲採用並返回可選類型的下標。 對於上面的numberOfLegs詞典,鍵值下標採用並返回類型爲Int?或「 optional int」的值。 字典類型使用可選的下標類型來對並不是每一個鍵都具備值的事實進行建模,並經過爲該鍵分配nil值來提供一種刪除鍵值的方法。
下標能夠採用任意數量的輸入參數,而且這些輸入參數能夠是任何類型。下標還能夠返回任何類型的值。
像函數同樣,下標能夠採用不一樣數量的參數,併爲其參數提供默認值,如Variadic Parameters和Default Parameter Values中所述。可是,與函數不一樣,下標不能使用輸入輸出參數。
一個類或結構體能夠根據須要提供儘量多的下標實現,而且將根據使用下標時在下標括號中包含的一個或多個值的類型來推斷要使用的適當下標。多個下標的定義稱爲下標重載。
雖然下標採用單個參數是最多見的,可是若是適合您的類型,則還能夠定義帶有多個參數的下標。下面的示例定義一個Matrix結構體,該結構體表示Double值的二維矩陣。矩陣結構的下標帶有兩個整數參數:
struct Matrix {
let rows: Int, columns: Int
var grid: [Double]
init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns
grid = Array(repeating: 0.0, count: rows * columns)
}
func indexIsValid(row: Int, column: Int) -> Bool {
return row >= 0 && row < rows && column >= 0 && column < columns
}
subscript(row: Int, column: Int) -> Double {
get {
assert(indexIsValid(row: row, column: column), "Index out of range")
return grid[(row * columns) + column]
}
set {
assert(indexIsValid(row: row, column: column), "Index out of range")
grid[(row * columns) + column] = newValue
}
}
}
複製代碼
Matrix提供了一個初始化器,該初始化器接受稱爲行和列的兩個參數,並建立一個足夠大的數組來存儲行*列類型爲Double的值。 矩陣中的每一個位置的初始值均爲0.0。 爲此,將數組大小和初始單元格值0.0傳遞給數組初始化程序,該初始化程序建立並初始化正確大小的新數組。 使用Creating an Array with a Default Value將詳細描述此初始化程序。
您能夠經過將適當的行數和列數傳遞給其初始化程序來構造新的Matrix實例:
var matrix = Matrix(rows: 2, columns: 2)
複製代碼
上面的示例建立一個具備兩行兩列的新Matrix實例。 此Matrix實例的網格數組其實是矩陣的扁平版本,從左上角到右下角讀取:
能夠經過將行和列值傳遞到下標(以逗號分隔)來設置矩陣中的值:
matrix[0, 1] = 1.5
matrix[1, 0] = 3.2
複製代碼
這兩個語句調用下標的設置器,以在矩陣的右上位置(行爲0,列爲1)設置值爲1.5,在左下角位置(行爲1,列爲0)設置值爲3.2:
Matrix下標的getter和setter都包含一個斷言,以檢查下標的行和列值是否有效。 爲了幫助進行這些聲明,Matrix包含了一個便捷的方法,稱爲indexIsValid(row:column :),該方法檢查所請求的行和列是否在矩陣的範圍內:
func indexIsValid(row: Int, column: Int) -> Bool {
return row >= 0 && row < rows && column >= 0 && column < columns
}
複製代碼
若是您嘗試訪問矩陣邊界以外的下標,則會觸發一個斷言:
let someValue = matrix[2, 2]
// This triggers an assert, because [2, 2] is outside of the matrix bounds.
複製代碼
如上所述,實例下標是您在特定類型的實例上調用的下標。 您還能夠定義在類型自己上調用的下標。 這種下標稱爲類型下標。 您能夠經過在下標關鍵字以前寫入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)
複製代碼
這一章節主要講的是能夠使用subscript語法爲類、結構體和枚舉定義下標語法,這樣類、結構體和枚舉就能夠和數組、字典同樣使用下標來查詢和設置對應索引的值。主要的內容:
最後,有收穫的朋友麻煩點個贊呦,謝謝~
參考文檔: Swift - Subscripts