下標的使用方式你一定不陌生,我們來看一個範例:
var 購物清單 = ["藍寶堅尼", "樂高", "陶朱隱園"]
print(購物清單[1]) // 樂高
購物清單[1] = "草莓好朋友牛奶"
print(購物清單[1]) // 草莓好朋友牛奶
對於 Collection Tpye,這種表示應該是不會有太多問題,反倒是 Class、Struct 和 Enum,也可以支援這樣的寫法,以中括號來表示的這種形式就叫做下標,Subscript 是一種用來存取及使用,我們可以指定 index 來取值,改派資料。
subscript(參數: 型別) -> 型別 {
get {
...
}
set {
...
}
}
這種寫法是不是很像 computed property,利用 subscript 當作關鍵字,可以設定這個下標是否可讀寫或是可讀而已,一樣使用 getter 以及 setter 來實作,參數必須指定型別,至於要不要有回傳,就看使用的情境如何再決定。
既然很像 computer property,所以也可以單純只讀就好,省略 setter:
subscript(參數: 型別) -> 型別 {
...
}
直接來舉一個範例:
struct 放空大賽 {
var 參賽者 = ["張三","李四","王五","茶六"]
subscript(index: Int) -> String {
get {
參賽者[index]
}
set {
self.參賽者[index] = newValue
}
}
}
var racing = 放空大賽()
print(racing.參賽者[1]) //
racing.參賽者[3] = "皮皮"
print(racing.參賽者[3]) // 皮皮
Subscript 允許多個參數傳入,也許允許不同型別的參數輸入,對於下標這種情況又稱為 Subscript Overloading。
enum Sex {
case male, female, transgender
}
struct People {
var name = "安竹皮皮"
func getIntro(name: String, sex: Sex) -> String {
var 性別: String = ""
switch sex {
case .male:
性別 = "小男森"
case .female:
性別 = "小女森"
default:
性別 = "第三性"
}
return "Hi,我是\(name),性別是\(性別)~"
}
subscript(姓名 name: String,性別 sex: Sex) -> String {
return getIntro(name: name, sex: sex)
}
}
let people = People()
print(people[姓名: "我是皮皮啦", 性別: .male])
// Hi,我是我是皮皮啦,性別是小男森~