用下標(biāo)腳本訪問一個數(shù)組(Array)實例中的元素可以這樣寫 someArray[index] 壁袄,訪問字典(Dictionary)實例中的元素可以這樣寫 someDictionary[key]益缎。
注意:
Swift 中字典的附屬腳本實現(xiàn)中,在get部分返回值是Int?然想,上例中的numberOfLegs字典通過附屬腳本返回的是一個Int?或者說“可選的int”莺奔,不是每個字典的索引都能得到一個整型值,對于沒有設(shè)過值的索引的訪問返回的結(jié)果就是nil变泄;同樣想要從字典實例中刪除某個索引下的值也只需要給這個索引賦值為nil即可令哟。
下標(biāo)腳本語法
定義下標(biāo)腳本使用subscript關(guān)鍵字,顯式聲明入?yún)ⅲㄒ粋€或多個)和返回類型妨蛹。與實例方法不同的是下標(biāo)腳本可以設(shè)定為讀寫或只讀屏富。這種方式又有點像計算型屬性的getter和setter:
subscript(index: Int) -> Int {
get {
// 返回與入?yún)⑵ヅ涞腎nt類型的值
}
set(newValue) {
// 執(zhí)行賦值操作
}
}
newValue的類型必須和下標(biāo)腳本定義的返回類型相同。與計算型屬性相同的是set的入?yún)⒙暶鱪ewValue就算不寫蛙卤,在set代碼塊中依然可以使用默認(rèn)的newValue這個變量來訪問新賦的值狠半。
與只讀計算型屬性一樣,可以直接將原本應(yīng)該寫在get代碼塊中的代碼寫在subscript中:
subscript(index: Int) -> Int {
// 返回與入?yún)⑵ヅ涞腎nt類型的值
}
使用方法:
struct TimesTable {
let multiplier: Int
subscript(index: Int) -> Int {
return multiplier * index
}
}
let threeTimesTable = TimesTable(multiplier: 3)
print("3的6倍是\(threeTimesTable[6])")
// 輸出 "3的6倍是18”
下標(biāo)腳本選項
下標(biāo)腳本允許任意數(shù)量的入?yún)⑺饕眩⑶颐總€入?yún)㈩愋鸵矝]有限制神年。下標(biāo)腳本的返回值也可以是任何類型。下標(biāo)腳本可以使用變量參數(shù)和可變參數(shù)行嗤,但使用寫入讀出(in-out)參數(shù)或給參數(shù)設(shè)置默認(rèn)值都是不允許的已日。
下標(biāo)腳本可重載
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提供了一個兩個入?yún)⒌臉?gòu)造方法,入?yún)⒎謩e是rows和columns栅屏,創(chuàng)建了一個足夠容納rows * columns個數(shù)的Double類型數(shù)組飘千。通過傳入數(shù)組長度和初始值0.0到數(shù)組的一個構(gòu)造器堂鲜,將Matrix中每個元素初始值0.0。