swift 枚舉(枚舉關(guān)聯(lián)值、枚舉原始值、遞歸枚舉等)

枚舉語法

  • 枚舉名字以一個大寫字母開頭
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"
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容