下標(biāo)腳本允許你通過(guò)在實(shí)例后面的方括號(hào)中傳入一個(gè)或者多個(gè)的索引值來(lái)對(duì)實(shí)例進(jìn)行訪(fǎng)問(wèn)和賦值。語(yǔ)法類(lèi)似于實(shí)例方法和計(jì)算型屬性的混合。與定義實(shí)例方法類(lèi)似,定義下標(biāo)腳本使用subscript關(guān)鍵字,顯式聲明入?yún)?一個(gè)或多個(gè))和返回類(lèi)型。與實(shí)例方法不同的是下標(biāo)腳本可以設(shè)定為讀寫(xiě)或只讀。這種方式又有點(diǎn)像計(jì)算型屬性的getter和setter:
subscript(index: Int) -> Int {
get {
// 返回與入?yún)⑵ヅ涞腎nt類(lèi)型的值
}
set(newValue) {
// 執(zhí)行賦值操作
}
}
newValue的類(lèi)型必須和下標(biāo)腳本定義的返回類(lèi)型相同。與計(jì)算型屬性相同的是set的入?yún)⒙暶?code style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; font-size: 14px; padding: 0px 5px; color: rgb(199, 37, 78); background-color: rgb(248, 248, 248); white-space: nowrap; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; margin: 0px 2px; border: 1px solid rgb(234, 234, 234);">newValue就算不寫(xiě),在set代碼塊中依然可以使用默認(rèn)的newValue這個(gè)變量來(lái)訪(fǎng)問(wèn)新賦的值。
與只讀計(jì)算型屬性一樣,可以直接將原本應(yīng)該寫(xiě)在get代碼塊中的代碼寫(xiě)在subscript中:
subscript(index: Int) -> Int {
// 返回與入?yún)⑵ヅ涞腎nt類(lèi)型的值
}
下面代碼演示了一個(gè)在TimesTable結(jié)構(gòu)體中使用只讀下標(biāo)腳本的用法,該結(jié)構(gòu)體用來(lái)展示傳入整數(shù)的n倍。
struct TimesTable {
let multiplier: Int
subscript(index: Int) -> Int {
return multiplier * index
}
}
let threeTimesTable = TimesTable(multiplier: 3)
println("3的6倍是\(threeTimesTable[6])")
// 輸出 "3的6倍是18"
在上例中,通過(guò)TimesTable結(jié)構(gòu)體創(chuàng)建了一個(gè)用來(lái)表示索引值三倍的實(shí)例。數(shù)值3作為結(jié)構(gòu)體構(gòu)造函數(shù)入?yún)⒊跏蓟瘜?shí)例成員multiplier。
你可以通過(guò)下標(biāo)腳本來(lái)得到結(jié)果,比如threeTimesTable[6]。這條語(yǔ)句訪(fǎng)問(wèn)了threeTimesTable的第六個(gè)元素,返回6的3倍即18。
注意:
TimesTable例子是基于一個(gè)固定的數(shù)學(xué)公式。它并不適合開(kāi)放寫(xiě)權(quán)限來(lái)對(duì)threeTimesTable[someIndex]進(jìn)行賦值操作,這也是為什么附屬腳本只定義為只讀的原因。