## Swift 枚舉
### 枚舉定義
定義語法:
```
emun 枚舉名稱 {
case 枚舉值
case 枚舉值
...
}
```
例如:定義枚舉型 Month 時,我們可以使用如下方式:
```
enum Month{
case January
case February
case March
case April
case May
case June
case July
case August
case September
case October
case November
case December
}
```
### 枚舉型的取值
```
var currMonth = Month.September
// 當確定了變量是枚舉類型也可以直接使用 .枚舉名 獲取。
var currMonth: Month = .September
```
### 使用枚舉類型
```
// 枚舉月份
enum Month{
case January
case February
case March
case April
case May
case June
case July
case August
case September
case October
case November
case December
}
// 枚舉月份 可以將case省略而將定義放在一行
enum Season{
case Spring, Summer, Autumn, Winter
}
func season(month: Month) -> Season{
switch month {
case .March, .April, .May:
return .Spring
case .June, .July, .August:
return .Summer
case .September, .October, .November:
return .Autumn
case .December, .January, .February:
return .Winter
}
}
print( season(month: .April ) ) // Spring
```
### 枚舉之原始值
```
enum Month: Int { // 定義原始值是整形類型
case January = 1
case February = 2
case March = 3
case April = 4
case May = 5
case June = 6
case July = 7
case August = 8
case September = 9
case October = 10
case November = 11
case December = 12
}
// 查找當前月份距離新年還剩多少個月
func monthsBeforeNewYear( _ month: Month ) -> Int{
return 12 - month.rawValue
}
let month: Month = .October
monthsBeforeNewYear(month) // 距離新年還有 2 個月
// 使用枚舉型的構造函數進行數據處理
let input = 2
if let month = Month( rawValue: input) {
monthsBeforeNewYear(month)
}
```
### 使用枚舉型默認的原始值
```
enum Grade: Int{
case F, E, D, C, B, A
}
let grade: Grade = .A
print("Your score is \(grade.rawValue)") // Your score is 5
```
> 枚舉型的原始值默認從0開始計算,逐步+1。
自定義枚舉型的原始值
```
enum Coin: Int{
case Penny = 1
case Nickel = 5
case Dime = 10
case Quarter = 25
}
let coin: Coin = .Quarter
print("It's \(coin.rawValue) cents") // It's 25 cents
```
### 枚舉其他類型原始值
枚舉型的rawValue為String定義
```
enum ProgrammingLanguage: String { // 枚舉型的rawValue為String
case Swift // 不填寫 使用 ProgrammingLanguage.rawValue 的值為:Swift,即默認原始值為 Swift
case ObjectiveC = "Objective-C"
case C
case Java
}
var myFavoriteLanguage: ProgrammingLanguage = .ObjectiveC
print("\(myFavoriteLanguage.rawValue) is my favorite language.") // Objective-C is my favorite language.
myFavoriteLanguage = ProgrammingLanguage.Swift
print("\(myFavoriteLanguage.rawValue) is my favorite language.") // Swift is my favorite language.
```
### 枚舉之關聯值
在Swift中,枚舉型支持枚舉的可能性可以和一個變量相關聯(Associat Value),并且他們之間的值類型可以不同。
#### 關聯一個值
下列是一個用戶在 ATM 取款的場景,判斷用戶取的錢是否小于賬戶余額。
> 如果關聯值是`Associat Value`,則不需要像聲明 `Raw Value`一樣在聲明enum時指明類型。
```
enum AtmStatus {
case Success(Int) // 枚舉的值關聯一個整型值
case Error(String) // 枚舉的值關聯一個字符串
case Waiting
}
var balance = 1000 // 賬戶與余額
func withDraw( amount: Int) -> AtmStatus { // 返回值為枚舉型
if balance >= amount{
balance -= amount
return .Success(balance)
}else{
return .Error("Not enough money")
}
}
let result = withDraw(amount: 100)
switch result { // 在判斷語句中使用 let 解包
case let .Success(newBanacle):
print("\(newBanacle) Yuan left in your account.")
case let .Error(errorMessage):
print("Error: \(errorMessage)")
case .Waiting:
print("Waiting")
}
```
> 枚舉型中關聯值不是必須的,可以有的存在,有的不存在。
#### 關聯多個值
關聯多個值時,參數相當于**元組**。
> 關聯值時還可以定義名稱,也可以理解為是元祖的分量名稱。
```
enum Shape {
case Square( side: Double ) // 正方形
case Rectangle( width: Double, height: Double ) // 長方形
case Circle(centerx: Double , centery: Double , radius: Double) // 圓形
case Point // 點,不存在關聯值
}
let square = Shape.Square(side: 10)
let rectangle = Shape.Rectangle(width: 20, height: 30)
let circle = Shape.Circle(centerx: 40, centery: 50, radius: 60)
let point = Shape.Point
func area(shape: Shape) -> Double{
switch shape {
case let .Square( side ):
return side * side
case let .Rectangle( width , height ):
return width * height
case let .Circle( _ , _ , r ): // 使用 _ 忽略元祖的解包參數
return M_PI * r * r
case .Point:
return 0
}
}
area(shape: square) // 正方形
area(shape: rectangle) // 長方形
area(shape: circle) // 圓形
area(shape: point) // 點
```
### 可選型的實質是枚舉
```
var website: Optional<String> = Optional.some("webfsd.com") // 定義可選型 var website: Stirng? = "webfsd.com"
website = .none // nil
// 可選型的解包
switch website {
case .none:
print("No website")
case let .some(website): // 將關聯值傳遞給website
print("The website is \(website)")
}
if let website = website {
print("The website is \(website)")
}else{
print("No website")
}
```
### 枚舉類型定義方法
枚舉型中也可以定義方法
```
// 枚舉類型定義方法
enum Shape{
case Square(side: Double) // 正方形
case Rectangle(width: Double , height: Double) // 長方形
case Circle(centerx: Double , centery: Double , radius: Double) // 圓形
case Point // 點
// 計算面積的方式
func area() -> Double {
switch self { // 枚舉變量判斷自己
case let .Square( side ):
return side * side
case let .Rectangle( width , height ):
return width * height
case let .Circle( _ , _ , r ):
return M_PI * r * r
case .Point:
return 0
}
}
}
let shape = Shape.Square(side: 10)
let rectangle = Shape.Rectangle(width: 10, height: 5)
let circle = Shape.Circle(centerx: 10, centery: 20, radius: 8)
let point = Shape.Point
shape.area()
rectangle.area()
circle.area()
point.area()
```
### 枚舉類型是值類型
```
enum Direction{
case North
case South
case East
case West
}
var d1 = Direction.East
var d2 = d1
d2 = Direction.West
d1 // East
d2 // West
```
- 學習筆記
- 基礎
- 基本類型之整型
- 基本類型之浮點型
- 基本類型之布爾類型以及簡單的 if 語句
- 基礎類型之元組
- 基本類型之其他
- 運算符
- 基礎運算符
- 比較運算符、邏輯運算符
- 三元運算符
- 范圍運算符for-in
- 邏輯控制
- 循環結構
- 選擇結構
- 字符串
- Character和Unicode
- String.index 和 range
- 可選型
- 容器類
- 數組初始化
- 數組基本操作
- 字典初始化
- 字典基本操作
- 集合初始化
- 集合基本操作
- 函數
- 閉包
- 枚舉
- 結構體
- 類
- 文檔注釋
- 屬性和方法
- 下標和運算符重載
- 拓展和泛型
- 協議
- 其他
- Swift 3.0 For 循環
- Swift 隨機數的生成
- IOS開發玩轉界面 UIKit
- UILable 文本顯示控件
- UIButton 簡單的交互控件
- UIImageView 圖片控件
- UISearchBar 搜索控件