iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 19
0

Enumeration 列舉

在 Swift 中,Enumeration 可以把數個例子集合起來,作為是一種型別,每一個例子可能代表著一種情境,Enumeration 的每一個例子都允許有 Raw Value,作為初始值,透過宣告型別的方式,決定 Raw Value 的型別為何。

Enumeration 語法

enum 列舉 {
	case 列舉案例1
	case 列舉案例2
	.
	.
}

透過 enum 作為開頭,為你的列舉命名,這裡的命名方式就跟一般常數變數命名有些不同,有幾個要注意的地方:

  • 如果是英文,以大寫字母作為開頭
  • 開頭不能為數字或是特殊符號

《 Day 14 | Swift 流程控制:If 和 Switch 》冷知識 1:Switch 的使用必須是 exhaustive 段落中,有使用到一個 Enumeration:

enum Animals {
    case dog
    case cat
    case bird
}

建立一個 Animals 的 Enumeration,列舉了三個案例,這個就是最簡單的列舉方式。

至於 Enumerations 的使用方式會像是這樣:

列舉.列舉案例1
列舉.列舉案例2

所以我們想找到 Animals 中的 dog 案例,就可以這麼寫:

Animals.dog

冷知識1:Enum 使用上的簡化

為什麼在《 Day 14 | Swift 流程控制:If 和 Switch 》中,使用 Switch-Case 時,不用加上 Animals 就可以直接使用 .dog 或是 .cat

let animals: Animals = Animals.dog

switch animals {
case .dog:
    print("這是狗")
case .cat:
    print("這是貓")
case .bird:
    print("這是鳥")
}

因為我們在編譯的時候,就會透過型別推斷,知道這是一個 Animals 的 Enumeration,所以在指派新的值或是使用 Switch-Case 時,就可以省略列舉的名稱。

Enumerations Raw Values

在建立Enumerations 時,可以宣告案例的型別為何,使用方法如下:

enum 列舉: 案例原始值型別 {
	case 列舉案例1 = RawValue
	case 列舉案例2 = RawValue
	.
	.
}

在列舉後方加上 : 型別,可以用來宣告 Raw Value 的型別,但是只能儲存宣告時的型別,不允許其他型別的資料存入。

然而 Raw Value 的型別只能接受以下這幾個型別:

  • String
  • Character
  • Integer
  • Float
  • Double
enum Animals: String {
    case dog = "可愛狗狗"
    case cat = "憤怒貓貓"
    case bird = "興奮鳥鳥"
}

宣告 Animals 的 Case 可以有字串型別的初始值,在使用上就可以這樣使用:

列舉.列舉案例.rawValue
print(Animals.bird.rawValue) // 興奮鳥鳥

小知識2:Enum multiple cases in one line

你可以將多個 case 用 , 隔開不同的 case ,把他們全部寫在同一行。

enum Animals {
    case dog, cat, bird
}

Enum Associated Values

Enumerations 相關值,有了相關值,我們就可以透過這個來讀取外部的資料,我們來看下面這個範例:

enum Gender {
    case male
    case female
}

enum People {
    case name(_ name: String)
    case age(_ age: Int)
    case gender(_ gender: Gender)
}

相關值使用方式很像參數的宣告,每一個 case 都有一個附加情境,你可以自己選擇想要的參數數量及型別,同時也可以自定義一個 Enumeration,作為參數型別來使用。

Associated Values 允許不同 case 使用不同的型別,在使用上沒變,就依照你所設定的參數型別來輸入對應型別的資料:

let name = People.name(firstName: "安竹", lastName: "皮皮")
let age = People.age(23)
let gender = People.gender(.male)

可以使用 Switch-Case 的方式來取用 Associated Values

let people: People = .name(firstName: "安竹", lastName: "皮皮")
switch people {
case .name(firstName: let firstName, lastName: let lastName):
    print("你的姓名是 \(firstName + lastName)")
case .age(let age):
    print("你的年齡是 \(age) 歲")
case .gender(let gender):
    print(gender)
}

// Prints: 你的姓名是 安竹皮皮

Associated Values 可用來操作外部的資料,Enumeration 又可當作一個特殊型別,在分類上也會更好理解或是使用上更容易上手,更直覺一點,讓 Enumeration 功能更強大許多。


上一篇
Day 18 | Swift Closure
下一篇
Day 20 | Swift Class 與 Struct 快樂二選一:Class 篇
系列文
給我 30 天,給你一輩子:Swift 從零開始30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
ytyubox
iT邦新手 5 級 ‧ 2020-09-19 15:20:13

感謝分享,補充 indirect enum
https://www.hackingwithswift.com/example-code/language/what-are-indirect-enums
雖然平常用不太到,不過可以看看 /images/emoticon/emoticon12.gif

謝謝 ytyubox 大大幫忙補充! /images/emoticon/emoticon41.gif

我要留言

立即登入留言