下標腳本允許你通過在實例后面的方括號中傳入一個或者多個的索引值來對實例進行訪問和賦值。語法類似于實例方法和計算型屬性的混合。與定義實例方法類似,定義下標腳本使用subscript關(guān)鍵字,顯式聲明入?yún)?一個或多個)和返回類型。與實例方法不同的是下標腳本可以設(shè)定為讀寫或只讀。這種方式又有點像計算型屬性的getter和setter:
subscript(index: Int) -> Int {
get {
// 返回與入?yún)⑵ヅ涞腎nt類型的值
}
set(newValue) {
// 執(zhí)行賦值操作
}
}
newValue的類型必須和下標腳本定義的返回類型相同。與計算型屬性相同的是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就算不寫,在set代碼塊中依然可以使用默認的newValue這個變量來訪問新賦的值。
與只讀計算型屬性一樣,可以直接將原本應該寫在get代碼塊中的代碼寫在subscript中:
subscript(index: Int) -> Int {
// 返回與入?yún)⑵ヅ涞腎nt類型的值
}
下面代碼演示了一個在TimesTable結(jié)構(gòu)體中使用只讀下標腳本的用法,該結(jié)構(gòu)體用來展示傳入整數(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"
在上例中,通過TimesTable結(jié)構(gòu)體創(chuàng)建了一個用來表示索引值三倍的實例。數(shù)值3作為結(jié)構(gòu)體構(gòu)造函數(shù)入?yún)⒊跏蓟瘜嵗蓡Tmultiplier。
你可以通過下標腳本來得到結(jié)果,比如threeTimesTable[6]。這條語句訪問了threeTimesTable的第六個元素,返回6的3倍即18。
注意:
TimesTable例子是基于一個固定的數(shù)學公式。它并不適合開放寫權(quán)限來對threeTimesTable[someIndex]進行賦值操作,這也是為什么附屬腳本只定義為只讀的原因。