枚舉簡單認識
- Swift中的枚舉比OC中的枚舉強大, 因為Swift中的枚舉是一等類型, 它可以像類和結構體一樣增加屬性和方法房待。
語法
enum 枚舉名{
case
case
case
...
}
舉例:
//多個case分開寫
enum CompassPoint {
case north
case south
case east
case west
}
//多個case寫在同一行梭灿,使用逗號分開
enum Planet {
case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}
//創(chuàng)建CompassPoint的枚舉實例
var directionToHead = CompassPoint.west
directionToHead = .east
//也可以寫成
//var directionToHead:CompassPoint = .west
注意
:與C和Objective-C不同佛纫,Swift枚舉在創(chuàng)建時默認不分配整數(shù)值
脑漫。在CompassPoint例子中街望,未指明CompassPoint成員的類型
扮休,north锣枝,south厢拭,east和west不等于隱式0,1撇叁,2和3供鸠。
如果給north指定原始整數(shù)值,后面的值默認+1:
enum CompassPoint {
case north = 5, south, east, west
}
枚舉與Switch結合
- 通常將單個枚舉值與switch語句匹配
//switch覆蓋了CompassPoint的所有情況陨闹,則可省略default
directionToHead = .south
switch directionToHead {
case .north:
print("Lots of planets have a north")
case .south:
print("Watch out for penguins")
case .east:
print("Where the sun rises")
case .west:
print("Where the skies are blue")
}
//switch沒有覆蓋Planet的所有情況楞捂,需要添加default
let somePlanet = Planet.earth
switch somePlanet {
case .earth:
print("Mostly harmless")
default:
print("Not a safe place for humans")
}
關聯(lián)值(Associated Values)
定義Swift枚舉來存儲任何給定類型的關聯(lián)值
,而且每種枚舉情況的值類型可以不同
enum Barcode {
case upc(Int, Int, Int, Int)
case qrCode(String)
}
//創(chuàng)建Barcode枚舉實例
var productBarcode = Barcode.upc(8, 85909, 51226, 3)
productBarcode = .qrCode("ABCDEFGHIJKLMNOP")
可以將關聯(lián)值提取為switch語句的一部分趋厉。將每個關聯(lián)值提取為常量(let)或變量(var)寨闹,以便在switch中處理:
switch productBarcode {
case .upc(let numberSystem, let manufacturer, let product, let check):
print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")
case .qrCode(let productCode):
print("QR code: \(productCode).")
}
// Prints "QR code: ABCDEFGHIJKLMNOP."
如果枚舉case的所有關聯(lián)值都被提取為常量,或者都被提取為變量君账,則可以將var或let放置在case名稱前面繁堡,來提取所有的關聯(lián)值:
switch productBarcode {
case let .upc(numberSystem, manufacturer, product, check):
print("UPC : \(numberSystem), \(manufacturer), \(product), \(check).")
case let .qrCode(productCode):
print("QR code: \(productCode).")
}
// Prints "QR code: ABCDEFGHIJKLMNOP."
原始值(Raw Values)
- 隱式分配原始值
當使用存儲整數(shù)或字符串原始值的枚舉時,不必為每種case顯式分配原始值乡数,Swift將自動為其分配值椭蹄。如果使用整數(shù)為原始值,則每個case的原始值依次自增1净赴。若第一個case沒有設置原始值绳矩,則默認為0:
enum Planet: Int { //【Int表示原始值類型】
case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}
當使用字符串作為原始值類型時,每個case的原始值是該case的名稱玖翅。
enum CompassPoint: String {
case north, south, east, west
}
發(fā)現(xiàn)去掉String原始值類型翼馆,每個case的原始值也是該case的名稱
- 使用rawValue將枚舉值轉換為原始值:
let earthsOrder = Planet.earth.rawValue
// earthsOrder is 3
let sunsetDirection = CompassPoint.west.rawValue
// sunsetDirection is "west"
- 原始值初始化枚舉實例:
let directionToHead = CompassPoint(rawValue: "north")!
注意點:1.原始值區(qū)分大小寫。2.返回的是一個可選值,因為原始值對應的枚舉值不一定存在金度。