Swift教程之下標詳解。本站提示廣大學習愛好者:(Swift教程之下標詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Swift教程之下標詳解正文
類,構造和列舉類型都可以經由過程界說下標來拜訪一組或許一個序列中的成員元素。經由過程下標索引便可以便利地檢索和設置響應的值,而不須要其他的額定操作。好比你可以經由過程someArray[index]來拜訪數組中的元素,或許someDictionary[key]來對字典停止索引。
你可認為一個類型界說多個下標,和恰當的下標重載用來依據傳遞給下標的索引來設置響應的值。下標不只可以界說為一維的,還可以依據須要界說為多維的,多個參數的。
1、下口號法
下標可讓你經由過程實例名後加中括號內一個或多個數值的情勢檢索一個元素。語法和辦法語法和屬性語法相似,經由過程應用subscript症結界說,一個或多個輸出參數和一個前往值。分歧於實例辦法的是,下標可所以可讀寫的或許只讀的。這類行動經由過程一個getter和setter語句聯通,就像是盤算屬性一樣。
subscript(index: Int) -> Int {
get {
// return an appropriate subscript value here
}
set(newValue) {
// perform a suitable setting action here
}
}
newValue的類型和下標前往的類型一樣。和盤算屬性一樣,你可以選擇不指定setter的參數,由於當你不指定的時刻,默許參數newValue會被供給給setter。
和盤算屬性一樣,只讀下標可以不須要get症結詞:
subscript(index: Int) -> Int {
// return an appropriate subscript value here
}
上面是一個只讀下標的完成,界說了一個TimesTable構造來表現一個整數的倍數表:
struct TimesTable {
let multiplier: Int
subscript(index: Int) -> Int {
return multiplier * index
}
}
let threeTimesTable = TimesTable(multiplier: 3)
println("six times three is \(threeTimesTable[6])")
// prints "six times three is 18"
在這個例子中,實例TimesTable被創立為3倍數表,這是經由過程在初始化的時刻為multiplier參數傳入的數值3設置的。
留意:
倍數表是依據特定的數學規矩設置的,所以不該該為threeTimeTable[someIndex]元素設置一個新值,所以TimesTable的下標界說為只讀。
2、下標的應用
下標的詳細寄義由應用它時的高低文來肯定。下標重要用來作為聚集,列表和序列的元素快捷方法。你可以自在的為你的類或許構造界說你所須要的下標。
好比說,Swift中字典類型完成的下標是設置和檢索字典實例中的值。可以經由過程分離給出下標中的症結詞和值來設置多個值,也能夠經由過程下標來設置單個字典的值:
var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
numberOfLegs["bird"] = 2
下面的例子中界說了一個變量numberOfLegs,然後經由過程鍵值對初始化。numberOfLegs的類型是字典類型Dictionary<String, Int>。在字典創立以後,例子應用了下標賦值辦法添加了一個類型為字符串的鍵”bird”和Int值2到字典中。
留意:
Swift中字典類型完成的鍵值對下標是可選類型。關於numberOfLges字典來講,前往的值是Int?,也就是可選Int值。字典的這類應用可選類型下標的方法解釋不是一切的鍵都有對應的值。異樣也能夠經由過程給鍵賦值nil來刪除這個鍵。
3、下標選項
下標可以吸收隨意率性數目的參數,參數的類型也能夠各別。下標還可以前往任何類型的值。下標可使用變量參數或許可變參數,然則不克不及夠應用輸出輸入參數或許供給默許參數的值。
類或許構造可以依據須要完成各類下標方法,可以在須要的時刻應用適合的下標經由過程中括號中的參數前往須要的值。這類多下標的界說被稱作下標重載。
固然,最多見的下標用法是單個參數,也能夠界說多個參數的下標。上面的例子演示了一個矩陣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(count: rows * columns, repeatedValue: 0.0)
}
func indexIsValidForRow(row: Int, column: Int) -> Bool {
return row >= 0 && row < rows && column >= 0 && column < columns
}
subscript(row: Int, column: Int) -> Double {
get {
assert(indexIsValidForRow(row, column: column), "Index out of range")
return grid[(row * columns) + column]
}
set {
assert(indexIsValidForRow(row, column: column), "Index out of range")
grid[(row * columns) + column] = newValue
}
}
}
矩陣Matrix供給了一個初始化辦法,應用兩個參數rows和columns,然後樹立了一個數組來存儲類型為Double的值rows*columns。每一個矩陣中的地位都被設置了一個初始值0.0。經由過程傳遞初始值0.0和數組長度給數組初始化辦法完成上述操作。數組的初始化辦法在:創立和初始化數組中有更具體的論述。
你可以傳遞兩個參數row和column來完成Matrix的初始化:
var matrix = Matrix(rows: 2, columns: 2)
下面的初始化操作創立了一個兩行兩列的矩陣Matrix實例。這個矩陣實例的grid數組看起來是平展的,然則現實上是矩陣從左上到右下的一維存儲情勢。
矩陣中的值可以經由過程應用包括row和column和逗號的下標來設置:
matrix[0, 1] = 1.5
matrix[1, 0] = 3.2
這兩個語句挪用了下標的setter辦法為右上和左下角的兩個元素分離賦值1.5和3.2
矩陣下標的getter和setter辦法都包含了一個斷言語句來檢討下標row和column能否有用。經由過程indexIsValid辦法來斷定row和column能否在矩陣的規模內:
func indexIsValidForRow(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