1. Swift枚舉基本概念
Swift中的枚舉比OC中的枚舉強大, 因為Swift中的枚舉是一等類型,
它可以像類和結構體一樣增加屬性和方法
格式:
enum Method{
case 枚舉值
}
enum Method{
case Add
case Sub
case Mul
case Div
}
2. 枚舉的基本使用
- 可以枚舉值可以連著寫, 但是要以逗號
,分隔
enum Menthod1 {
case Add, Sub, Mul, Div
}
- 可以使用枚舉類型變量或常量接收枚舉值
var m: Method = .Add
- 注意: 如果變量或常量沒有指定類型, 那么前面必須加上該值屬于哪個枚舉類型
// var m1 = .Add //直接報錯
var m1 = Method.Add //正確寫法
-
利用Switch匹配
- 注意: 如果case中包含了所有的值, 可以不寫default.
- 如果case中沒有包含枚舉中所有的值, 必須寫default
//注意: 如果case中包含了所有的值, 可以不寫default.
//如果case中沒有包含枚舉中所有的值, 必須寫default
switch (Method.Add){
case Method.Add:
print("加法")
case Method.Sub:
print("減法")
case Method.Mul:
print("除法")
case Method.Div:
print("乘法")
default:
print("都不是")
}
3. 原始值
- OC中枚舉的本質就是整數, 所以OC中的枚舉是有原始值的,默認是從0開始
- 而Swift中的枚舉默認是沒有原始值的, 但是可以在定義時告訴系統讓枚舉有原始值
- 和OC中的枚舉一樣, 也可以指定原始值, 后面的值默認+1 , 但必須指定枚舉的類型, 并且一定是 Int 類型
- Swift中的枚舉除了可以指定整形以外還可以指定其它類型, 但是如果指定其它類型, 必須給所有枚舉值賦值, 因為不能自動遞增
// 指定了枚舉原始值類型為 Int , 所以并且給第一個枚舉值定義了原始值, 則后面的值默認 +1
enum Method3: Int{
case Add = 5, Sub, Mul, Div
}
// 自定的枚舉原始值的類型不是 Int , 所以后面的值不會默認 +1,
// 后面的也需要手動賦值
enum Method4: Double{
case Add = 5.0, Sub = 6.0, Mul = 6.1, Div = 8.0
}
- 原始值轉換為枚舉值
enum Method5: String{
case Add = "add", Sub = "sub", Mul = "mul", Div = "div"
}
-
獲取枚舉原始值
- rawValue代表將枚舉值轉換為原始值, 注意老版本中轉換為原始值的方法名叫toRaw
Method4.Sub.rawValue
print(Method4.Sub.rawValue)
// 輸出結果: 6.0
-
通過原始值創(chuàng)建枚舉值
- 原始值區(qū)分大小寫
- 返回的是一個可選值,因為原始值對應的枚舉值不一定存在
- 老版本中為fromRaw("add")
let m2 = Method5(rawValue: "add")
print(m2)
func chooseMethod(op:String){
// 由于返回是可選類型, 所以有可能為nil, 最好使用可選綁定
if let opE = Method5(rawValue: op){
switch (opE){
case .Add:
print("加法")
case .Sub:
print("減法")
case .Mul:
print("除法")
case .Div:
print("乘法")
}
}
}
4. 枚舉相關值
- 可以讓枚舉值對應的原始值不是唯一的, 而是一個變量.
- 每一個枚舉可以是在某種模式下的一些特定值
enum lineSegmentDescriptor{
case StartAndEndPattern(start:Double, end:Double)
case StartAndLengthPattern(start: Double, length:Double)
}
var lsd = lineSegmentDescriptor.StartAndLengthPattern(start: 0.0, length: 100.0)
lsd = lineSegmentDescriptor.StartAndEndPattern(start: 0.0, end: 50.0)
print(lsd)
// 輸出結果: StartAndEndPattern(0.0, 50.0)
- 利用switch提取枚舉關聯值
switch lsd {
case let .StartAndEndPattern(s, e):
print("start = \(s) end = \(e)")
case .StartAndLengthPattern(let s, let l):
print("start = \(s) lenght = \(l)")
}
// 輸出結果: start = 0.0 end = 50.0