枚舉語法
- 枚舉名字以一個大寫字母開頭
enum Season {
case spring
case summer
case autumn
case winter
}
注意:Swift枚舉在創(chuàng)建時未分配默認(rèn)整數(shù)值。spring,summer,autumn和winter不等于隱式0,1,2和3。相反,這些值的類型是已經(jīng)明確定義好的Season類型
- 枚舉使用
當(dāng)season的類型已知時,再次為其賦值可以省略枚舉類型名
var season = Season.spring
print(season) //spring
season = .summer
print(season) //summer
枚舉是值類型
enum Color{
case red
case green
case yellow
}
let currentColor = Color.yellow
//因為Color是一個枚舉,所以rememberedColor的值其實是currentColor的一個拷貝副本,而不是currentColor本身,它們是兩個完全不同的實例
var rememberedColor = currentColor
rememberedColor = .green
//通過log證明currentColor和rememberedColor其中任何一個修改都不會影響另一個
print(currentColor) //yellow
print(rememberedColor) //green
使用Switch語句匹配枚舉值
在判斷一個枚舉類型的值時,switch語句必須窮舉所有情況,忽略一個將無法通過編譯
var season = Season.spring
switch season {
case .spring:
print("spring")
case .summer:
print("summer")
case .autumn:
print("autumn")
case .winter:
print("winter")
}
CaseIterable 協(xié)議
枚舉遵循CaseIterable 協(xié)議
enum Season:CaseIterable {
case spring
case summer
case autumn
case winter
}
let count = Season.allCases.count
print(count) //4
for season in Season.allCases {
print(season)
}
//spring
//summer
//autumn
//winter
關(guān)聯(lián)值
Swift 枚舉可以用來存儲任意類型的關(guān)聯(lián)值
聲明存儲不同類型關(guān)聯(lián)值的枚舉成員(這個定義不提供任何Int或String類型的關(guān)聯(lián)值)
一個成員值是(Int,Int,Int)類型關(guān)聯(lián)值的num
一個成員值是(String,String)類型關(guān)聯(lián)值的str
enum Code{
case num(Int,Int,Int)
case str(String,String)
}
創(chuàng)建了一個名為code的變量,并為Code.num和Code.str賦值
var code = Code.num(2, 3, 3)
code = .str("A", "B")
使用switch語句檢查不同類型
switch code {
case .num(let num1, let num2, let num3):
print("\(num1),\(num2),\(num3)")
case .str(let str1, let str2):
print("\(str1),\(str2)")
}
//如果枚舉的所有關(guān)聯(lián)值都被提取為常量或者變量,則可以在前面放置單個var或let注釋,以簡潔起見
switch code {
case let .num(num1,num2,num3):
print("\(num1),\(num2),\(num3)")
case let .str(str1,str2):
print("\(str1),\(str2)")
}
原始值
枚舉成員可以設(shè)置原始值,這些原始值的類型必須相同
enum Season:String {
case spring = "A"
case summer = "B"
case autumn = "C"
case winter = "D"
}
注意: 原始值和關(guān)聯(lián)值是不同的。原始值是在定義枚舉時被預(yù)先填充的值。對于一個特定的枚舉成員,它的原始值始終不變。關(guān)聯(lián)值是創(chuàng)建一個基于枚舉成員的常量或變量時才設(shè)置的值,枚舉成員的關(guān)聯(lián)值可以變化。
原始值的隱式賦值
- 當(dāng)使用整數(shù)作為枚舉成員的原始值時,隱式賦值的值依次遞增1
enum Season:Int {
case spring = 1
case summer
case autumn
case winter
}
- 當(dāng)使用字符串作為枚舉類型的原始值時,每個枚舉成員的隱式原始值為該枚舉成員的名稱
enum Season:String {
case spring
case summer
case autumn
case winter
}
- 使用枚舉成員的rawValue屬性可以訪問該枚舉成員的原始值
print(Season.spring.rawValue)
- 使用原始值初始化枚舉實例
可以通過rawValue初始化一個枚舉成員,返回值則是枚舉成員或nil
可以通過這個來判斷這個新枚舉成員是否在枚舉值中
enum Season:Int {
case spring
case summer
case autumn
case winter
}
if let season = Season(rawValue: 5){
switch season{
case .spring:
print("spring")
case .summer:
print("summer")
case .autumn:
print("autumn")
case .winter:
print("winter")
}
}else{
print("涼涼")
}
遞歸枚舉
- 遞歸枚舉是一種枚舉類型
- 有一個或多個枚舉成員使用該枚舉類型的作為枚舉成員
- 在枚舉成員前加上
indirect來表示該成員可遞歸
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
枚舉之前寫indirect來讓整個枚舉成員在需要時可以遞歸
indirect enum ArithmeticExpression {
case number(Int)
case addition(ArithmeticExpression, ArithmeticExpression)
case multiplication(ArithmeticExpression, ArithmeticExpression)
}
- 應(yīng)用
indirect enum ArithmeticExpression {
case number(Int)
case addition(ArithmeticExpression, ArithmeticExpression)
case multiplication(ArithmeticExpression, ArithmeticExpression)
}
func evaluate(_ expression:ArithmeticExpression) -> Int {
switch expression {
case let .number(value):
return value
case let .addition(value1, value2):
return evaluate(value1) + evaluate(value2)
case let .multiplication(value1, value2):
return evaluate(value1) - evaluate(value2)
}
}
let num = ArithmeticExpression.number(5)
print(evaluate(num)) // 打印 "5"
print(evaluate(ArithmeticExpression.addition(num, num))) // 打印 "10"
print(evaluate(ArithmeticExpression.multiplication(num, num))) // 打印 "0"