下標(biāo) (subscripts)可以定義在類(class)、結(jié)構(gòu)體(structure)和枚舉(enumeration)中,是訪問集合(collection),列表(list)或序列(sequence)中元素的快捷方式。
可以使用下標(biāo)的索引,設(shè)置和獲取值,而不需要再調(diào)用對(duì)應(yīng)的存取方法。
一個(gè)類型可以定義多個(gè)下標(biāo),通過不同索引類型進(jìn)行重載。下標(biāo)不限于一維,可以定義具有多個(gè)入?yún)⒌南聵?biāo)滿足自定義類型的需求。
下標(biāo)語法(Subscript Syntax)
定義下標(biāo)使用subscript關(guān)鍵字,指定一個(gè)或多個(gè)輸入?yún)?shù)和返回類型。
下標(biāo)可以設(shè)定為讀寫或只讀。這種行為由 getter 和 setter 實(shí)現(xiàn),有點(diǎn)類似計(jì)算型屬性。
如果不指定參數(shù),setter 會(huì)提供一個(gè)名為newValue的默認(rèn)參數(shù)。
如同只讀計(jì)算型屬性,可以省略只讀下標(biāo)的get關(guān)鍵字。
struct TimesTable {
let multiplier: Int
subscript(index: Int) -> Int {
return multiplier * index
}
}
let threeTimesTable = TimesTable(multiplier: 3)
print("six times three is \(threeTimesTable[6])")
// 輸出 "six times three is 18"
下標(biāo)用法(Subscript Usage)
下標(biāo)的確切含義取決于使用場(chǎng)景。下標(biāo)通常作為訪問集(collection),列表(list)或序列(sequence)中元素的快捷方式??梢葬槍?duì)特定的類或結(jié)構(gòu)體的功能來自由地以最恰當(dāng)?shù)姆绞綄?shí)現(xiàn)下標(biāo)。
Swift 的Dictionary類型的下標(biāo)接受并返回可選類型的值。Dictionary類型之所以如此實(shí)現(xiàn)下標(biāo),是因?yàn)椴皇敲總€(gè)鍵都有個(gè)對(duì)應(yīng)的值,同時(shí)這也提供了一種通過鍵刪除對(duì)應(yīng)值的方式,只需將鍵對(duì)應(yīng)的值賦值為nil即可。
下標(biāo)選項(xiàng)(Subscript Options)
下標(biāo)可以接受任意數(shù)量的入?yún)?,并且這些入?yún)⒖梢允侨我忸愋?。下?biāo)的返回值也可以是任意類型。下標(biāo)可以使用變量參數(shù)和可變參數(shù),但不能使用輸入輸出參數(shù),也不能給參數(shù)設(shè)置默認(rèn)值。
一個(gè)類或結(jié)構(gòu)體可以根據(jù)自身需要提供多個(gè)下標(biāo)實(shí)現(xiàn),使用下標(biāo)時(shí)將通過入?yún)⒌臄?shù)量和類型進(jìn)行區(qū)分,自動(dòng)匹配合適的下標(biāo),這就是下標(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
}
}
}
var matrix = Matrix(rows: 2, columns: 2)
matrix[0, 1] = 1.5
matrix[1, 0] = 3.2