下標(biāo)腳本 可以定義在類(Class)、結(jié)構(gòu)體(structure)和枚舉(enumeration)中,是訪問(wèn)集合(collection),列表(list)或序列(sequence)中元素的快捷方式??梢允褂孟聵?biāo)腳本的索引設(shè)置和獲取值,不需要再調(diào)用對(duì)應(yīng)的存取方法。舉例來(lái)說(shuō),用下標(biāo)腳本訪問(wèn)一個(gè)Array實(shí)例中的元素可以寫作someArray[index],訪問(wèn)Dictionary實(shí)例中的元素可以寫作someDictionary[key]。
下標(biāo)腳本語(yǔ)法
subscript(index: Int) -> Int {
get {
// 返回一個(gè)適當(dāng)?shù)?Int 類型的值
}
set(newValue) {
// 執(zhí)行適當(dāng)?shù)馁x值操作
}
}
newValue的類型和下標(biāo)腳本的返回類型相同。如同計(jì)算型屬性,可以不指定 setter 的參數(shù)(newValue)。如果不指定參數(shù),setter 會(huì)提供一個(gè)名為newValue的默認(rèn)參數(shù)。
如同只讀計(jì)算型屬性,可以省略只讀下標(biāo)腳本的get關(guān)鍵字:
subscript(index: Int) -> Int {
// 返回一個(gè)適當(dāng)?shù)?Int 類型的值
}
下面代碼演示了只讀下標(biāo)腳本的實(shí)現(xiàn),這里定義了一個(gè)TimesTable結(jié)構(gòu)體,用來(lái)表示傳入整數(shù)的乘法表:
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)腳本選項(xiàng)
下標(biāo)腳本可以接受任意數(shù)量的入?yún)?,并且這些入?yún)⒖梢允侨我忸愋汀O聵?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í)將通過(guò)入?yún)⒌臄?shù)量和類型進(jìn)行區(qū)分,自動(dòng)匹配合適的下標(biāo)腳本,這就是下標(biāo)腳本的重載。
要點(diǎn)總結(jié)
Subscript在類和機(jī)構(gòu)體里可以重載