# Swift 枚舉
枚舉簡單的說也是一種數據類型,只不過是這種數據類型只包含自定義的特定數據,它是一組有共同特性的數據的集合。
Swift 的枚舉類似于 Objective C 和 C 的結構,枚舉的功能為:
* 它聲明在類中,可以通過實例化類來訪問它的值。
* 枚舉也可以定義構造函數(initializers)來提供一個初始成員值;可以在原始的實現基礎上擴展它們的功能。
* 可以遵守協議(protocols)來提供標準的功能。
### 語法
Swift 中使用 enum 關鍵詞來創建枚舉并且把它們的整個定義放在一對大括號內:
```
enum enumname {
// 枚舉定義放在這里
}
```
例如我們定義以下表示星期的枚舉:
```
import Cocoa
// 定義枚舉
enum DaysofaWeek {
case Sunday
case Monday
case TUESDAY
case WEDNESDAY
case THURSDAY
case FRIDAY
case Saturday
}
var weekDay = DaysofaWeek.THURSDAY
weekDay = .THURSDAY
switch weekDay
{
case .Sunday:
print("星期天")
case .Monday:
print("星期一")
case .TUESDAY:
print("星期二")
case .WEDNESDAY:
print("星期三")
case .THURSDAY:
print("星期四")
case .FRIDAY:
print("星期五")
case .Saturday:
print("星期六")
}
```
以上程序執行輸出結果為:
```
星期四
```
枚舉中定義的值(如 `Sunday`,`Monday`,`……`和`Saturday`)是這個枚舉的**成員值**(或**成員**)。`case`關鍵詞表示一行新的成員值將被定義。
> 注意:
和 C 和 Objective-C 不同,Swift 的枚舉成員在被創建時不會被賦予一個默認的整型值。在上面的`DaysofaWeek`例子中,`Sunday`,`Monday`,`……`和`Saturday`不會隱式地賦值為`0`,`1`,`……`和`6`。相反,這些枚舉成員本身就有完備的值,這些值是已經明確定義好的`DaysofaWeek`類型。
```
var weekDay = DaysofaWeek.THURSDAY
```
`weekDay`的類型可以在它被`DaysofaWeek`的一個可能值初始化時推斷出來。一旦`weekDay`被聲明為一個`DaysofaWeek`,你可以使用一個縮寫語法(.)將其設置為另一個`DaysofaWeek`的值:
```
var weekDay = .THURSDAY
```
當`weekDay`的類型已知時,再次為其賦值可以省略枚舉名。使用顯式類型的枚舉值可以讓代碼具有更好的可讀性。
枚舉可分為相關值與原始值。
### 相關值與原始值的區別
| 相關值 | 原始值 |
| --- | --- |
| 不同數據類型 | 相同數據類型 |
| 實例: enum {10,0.8,"Hello"} | 實例: enum {10,35,50} |
| 值的創建基于常量或變量 | 預先填充的值 |
| 相關值是當你在創建一個基于枚舉成員的新常量或變量時才會被設置,并且每次當你這么做得時候,它的值可以是不同的。 | 原始值始終是相同的 |
## 相關值
以下實例中我們定義一個名為 Student 的枚舉類型,它可以是 Name 的一個相關值(Int,Int,Int,Int),或者是 Mark 的一個字符串類型(String)相關值。
```
import Cocoa
enum Student{
case Name(String)
case Mark(Int,Int,Int)
}
var studDetails = Student.Name("Runoob")
var studMarks = Student.Mark(98,97,95)
switch studMarks {
case .Name(let studName):
print("學生的名字是: \(studName)。")
case .Mark(let Mark1, let Mark2, let Mark3):
print("學生的成績是: \(Mark1),\(Mark2),\(Mark3)。")
}
```
以上程序執行輸出結果為:
```
學生的成績是: 98,97,95。
```
## 原始值
原始值可以是字符串,字符,或者任何整型值或浮點型值。每個原始值在它的枚舉聲明中必須是唯一的。
在原始值為整數的枚舉時,不需要顯式的為每一個成員賦值,Swift會自動為你賦值。
```
import Cocoa
enum Month: Int {
case January = 1, February, March, April, May, June, July, August, September, October, November, December
}
let yearMonth = Month.May.rawValue
print("數字月份為: \(yearMonth)。")
```
以上程序執行輸出結果為:
```
數字月份為: 5。
```
- Swift 簡介
- Swift 環境搭建
- Swift 基本語法
- Swift 數據類型
- Swift 變量
- Swift 可選(Optionals)類型
- Swift 常量
- Swift 字面量
- Swift 運算符
- Swift 條件語句
- Swift if 語句
- Swift if...else 語句
- Swift if...else if...else 語句
- Swift 嵌套 if 語句
- Swift switch 語句
- Swift 循環
- Swift for-in 循環
- Swift for 循環
- Swift While 循環
- Swift repeat...while 循環
- Swift Continue 語句
- Swift Break 語句
- Swift Fallthrough 語句
- Swift 字符串
- Swift 字符(Character)
- Swift 數組
- Swift 字典
- Swift 函數
- Swift 閉包
- Swift 枚舉
- Swift 結構體
- Swift 類
- Swift 屬性
- Swift 方法
- Swift 下標腳本
- Swift 繼承
- Swift 構造過程
- Swift 析構過程
- Swift 可選鏈
- Swift 自動引用計數(ARC)
- Swift 類型轉換
- Swift 擴展
- Swift 協議
- Swift 泛型
- Swift 訪問控制