iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 25
0

Subscripts 下標

下標的使用方式你一定不陌生,我們來看一個範例:

var 購物清單 = ["藍寶堅尼", "樂高", "陶朱隱園"]
print(購物清單[1]) // 樂高

購物清單[1] = "草莓好朋友牛奶"
print(購物清單[1]) // 草莓好朋友牛奶

對於 Collection Tpye,這種表示應該是不會有太多問題,反倒是 Class、Struct 和 Enum,也可以支援這樣的寫法,以中括號來表示的這種形式就叫做下標,Subscript 是一種用來存取及使用,我們可以指定 index 來取值,改派資料。

Subscript Syntax

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 Option

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,我是我是皮皮啦,性別是小男森~

上一篇
Day 24 | Swift Reference Type 與 Value Type
下一篇
Day 26 | Swift Protocol 與 Extension:Protocol 篇
系列文
給我 30 天,給你一輩子:Swift 從零開始30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言