在C語言中枚舉名和一個整型值相對應
Swift中的枚舉更加靈活,不必給每?個枚舉成員提供?個值。如果給枚舉成員提供?個值(稱為“原始”值),則該值的類型可以是字符串,字符,或是?個整型值或浮點數。
此外,枚舉成員可以指定任何類型的相關值存儲到枚舉成員值中,就像其他語?中的聯合體(unions)和變體(variants)。你可以定義?組通?的相關成員作為枚舉的?部分,每?組都有不同的?組與它相關的適當類型的數值。
1、枚舉語法
使? enum? 關鍵詞來創建枚舉并且把它們的整個定義放在?對?括號內:
~~~
enum SomeEnumeration {
// enumeration definition goes here
}
~~~
~~~
enum CompassPoint {
case North
case South
case East
case West
}
// North,South,East 和 West 不會隱式地賦值為了 0 , 1 , 2 和 3
print(CompassPoint.North)
//North
//多個成員值可以在同一行上,用逗號隔開
enum T1 {
case T11, T12, T13, T14
}
print("\(T1.T11), \(T1.T12)")
//T11, T12
//每個枚舉定義了一個全新的類型,他們的名字必須以大寫字母開頭
var t2 = T1.T12 //t2的類型可以被推斷出來
let t1 : T1 = .T13
//定義一個變量或常量為枚舉類型的時候,如果指定了變量的枚舉類型,可以使用如上所示的縮寫語法
t2 = .T13 //當t2的類型已知的時候,也可以省略枚舉名
~~~
2、匹配枚舉值和switch語句
~~~
enum Test1 {
case TestValue1, TestValue2, TestValue3, TestValue4
}
let test : Test1 = .TestValue2
switch test {
case .TestValue1:
print("\(Test1.TestValue1)")
case .TestValue2:
print("\(Test1.TestValue2)")
case .TestValue3:
print("\(Test1.TestValue3)")
case .TestValue4:
print("\(Test1.TestValue4)")
}
//switch語句必須窮舉所有的枚舉值,否則不能通過編譯,或者提供一個default分支,此時可以不窮舉所有枚舉值
//TestValue2
~~~
3、相關值
可以定義 Swift 的枚舉存儲任何類型的相關值,如果需要的話,每個成員的數據類型可以是各不相同的。枚舉的這種特性跟其他語?中的可辨識聯合(discriminated unions),標簽聯合(tagged unions),或者變體(variants)相似
~~~
enum MyPhone {
case Describe1(String, Int)
case Describe2(String)
}
var phone1 = MyPhone.Describe1("小米", 1)
switch phone1 {
case MyPhone.Describe1(let param1, let param2) :
print("\(param1), \(param2)")
case MyPhone.Describe2(let param3):
print(param3)
}
phone1 = .Describe2("小米1")
switch phone1 {
case MyPhone.Describe1(let param1, let param2) :
print("\(param1), \(param2)")
case MyPhone.Describe2(let param3):
print(param3)
}
//小米, 1
//小米1
~~~
4、原始值
作為相關值的另?種選擇,枚舉成員可以被默認值(稱為原始值)賦值,其中這些原始值具有相同的類型。
原始值可以是字符串,字符,或者任何整型值或浮點型值。每個原始值在它的枚舉聲明中必須是唯?的。
注意:
原始值和相關值是不相同的。當你開始在你的代碼中定義枚舉的時候原始值是被預先填充的值。對于?個特定的枚舉成員,它的原始值始終是相同的。
相關值是當你在創建?個基于枚舉成員的新常量或變量時才會被設置,并且每次當你這么做得時候,它的值可以是不同的。
~~~
enum OriginalValue : Int {
case Age1 = 10
case Age2 = 20
case Age3 = 30
}
print(OriginalValue.Age2.rawValue)
//20
~~~
(1)原始值的隱式賦值
~~~
enum OriginalValue : Int {
case Age1 = 10
case Age2 //第一個賦值為10,后面的將隱式賦值,隱式賦值的值依次遞增1
case Age3
}
print(OriginalValue.Age2.rawValue)
//11
enum OriginalValue1 : Int {
case Value1 //如果第一個沒有被賦值,自動賦值為0
case Value2 = 3
case Value3
}
print(OriginalValue1.Value1.rawValue)
print(OriginalValue1.Value2.rawValue)
print(OriginalValue1.Value3.rawValue)
//0
//3
//4
~~~
(2)使?原始值初始化枚舉變量
如果在定義枚舉類型的時候使?了原始值,那么將會?動獲得?個初始化?法,這個?法將原始值類型作為參數,返回枚舉成員或者 nil? 。你可以使?這種初始化?法來創建?個新的枚舉變量。
~~~
enum ScoreLevel : Int {
case Level1 = 1, Level2, Level3, Level4, Level5
}
let scoreLevel = ScoreLevel(rawValue: 3) //返回值是可選類型
print(scoreLevel!)
//Level3
~~~
5、遞歸枚舉
算數表達式的?個重要特性是,表達式可以嵌套使?。例如,表達式 (5 + 4) * 2? 乘號右邊是?個數字,左邊則是另?個表達式。因為數據是嵌套的,因??來存儲數據的枚舉類型也許要?持這種嵌套————這表?枚舉類型需要?持遞歸。
遞歸枚舉(recursive enumeration)是?種枚舉類型,表?它的枚舉中,有?個或多個枚舉成員擁有該枚舉的其他成員作為相關值。使?遞歸枚舉時,編譯器會插??個中間層。你可以在枚舉成員前加上 indirect? 來表?這成員可遞歸。
~~~
enum ArithmeticExpression {
case Number(Int)
indirect case Addition(ArithmeticExpression, ArithmeticExpression)
indirect case Multiplication(ArithmeticExpression, ArithmeticExpression)
}
//也可以在枚舉類型開頭加上 indirect 關鍵字來表?它的所有成員都是可遞歸的
indirect enum ArithmeticExpression1 {
case Number(Int) //有?個或多個枚舉成員擁有該枚舉的其他成員作為相關值
case Addition(ArithmeticExpression1, ArithmeticExpression1)
case Multiplication(ArithmeticExpression1, ArithmeticExpression1)
}
func evaluate(expression: ArithmeticExpression) -> Int {
switch expression {
case .Number(let value):
return value
case .Addition(let left, let right):
return evaluate(left) + evaluate(right) //至于這里面怎么操作自己決定
case .Multiplication(let left, let right):
return evaluate(left) * evaluate(right)
}
}
// 計算 (5 + 4) * 2
let five = ArithmeticExpression.Number(5)
let four = ArithmeticExpression.Number(4)
let sum = ArithmeticExpression.Addition(five, four) //計算兩個數相加
print(evaluate(sum)) //這里執行evalute函數,進去后匹配到.Addition分支,分支中left又是.Number類型,返回數值進行計算
let product = ArithmeticExpression.Multiplication(sum, ArithmeticExpression.Number(2))
print(evaluate(product))
//9
//18
~~~
- 前言
- swift控制語句,for,while,repeat-while,if,switch
- swift之聲明常量和變量
- swift之數值類型雜談(數值)
- swift之 元組
- oc與swift混編,OC調用swift,swift調用OC
- swift之可選類型
- swift之數組(Array)、集合(Set)、字典(Dictionary)
- swift之switch續(元組,值綁定,where)
- swift之控制轉移語句,continue,break,fallthrough,return,帶標簽的語句
- swift之函數(functions)
- swift之閉包(closure)
- swift之枚舉
- swift之類和結構體
- swift之屬性
- swift之方法(Methods)