在瞭解Swift的枚舉以前,咱們回顧下C語言的枚舉寫法:swift
enum 枚舉名 {
枚舉值1,
枚舉值2,
....
};
<!--舉例:表示一週7天-->
enum Weak{
MON, TUE, WED, THU, FRI, SAT, SUN
};
<!--更改C中枚舉默認值-->
//若是沒有設置枚舉默認值,通常第一個枚舉成員的默認值爲整型0,後面依次遞推,若是咱們想更改,只須要這樣操做
enum Weak{
MON = 1, TUE, WED, THU, FRI, SAT, SUN
};
<!--C中定義一個枚舉變量-->
//代表建立了一個枚舉,並聲明瞭一個枚舉變量weak
enum Weak{
MON = 1, TUE, WED, THU, FRI, SAT, SUN
}weak;
//或者下面這種寫法,省略枚舉名稱
enum{
MON = 1, TUE, WED, THU, FRI, SAT, SUN
}weak;
複製代碼
在swift中,枚舉的建立方式以下,若是沒有指定枚舉值的類型,那麼enum默認枚舉值是整型
的markdown
<!--一、寫法一-->
enum Weak{
case MON
case TUE
case WED
case THU
case FRI
case SAT
case SUN
}
<!--二、寫法二-->
//也能夠直接一個case,而後使用逗號隔開
enum Weak{
case MON, TUE, WED, THU, FRI, SAT, SUN
}
<!--定義一個枚舉變量-->
var w: Weak = .MON
複製代碼
上訴代碼中咱們的枚舉類型默認是整型,這個和C是一致的,若是咱們想要表達的String怎麼辦?能夠經過指定enum的枚舉值的類型來建立,其中枚舉值和原始值rawValue
的關係爲case 枚舉值 = rawValue原始值
app
/*
=左邊的值是枚舉值,例如 MON
=右邊的值在swift中稱爲 RawValue(原始值),例如 "MON"
二者的關係爲:case 枚舉值 = rawValue原始值
*/
enum Weak: String{
case MON = "MON"
case TUE = "TUE"
case WED = "WED"
case THU = "THU"
case FRI = "FRI"
case SAT = "SAT"
case SUN = "SUN"
}
複製代碼
隱式RawValue
分配,隱式RawValue分配
是創建在Swift的類型推斷機制上的
,以下咱們先用Int
來舉例說明:<!--Int類型-->
//MON是從0開始一次遞推,而WED日後是從10開始一次遞推
enum ShortDayWeak: Int{
case mon, tue, wed, thu, fri = 10, sat, sun
}
複製代碼
系統默認是從0開始,在這個過程當中你能夠指定fri = 10,那麼對於sat,系統會從根據前一個case的值來作累加的操做,也就是11。spa
若是隻是對於Int類型適用,對於String類型也是同樣適用的。 接下來咱們要區分一個東西,咱們看如下代碼的打印結果3d
enum DayOfWeek:String {
case monday, tuesday, wednesday, thursday, friday, saturday, sunday
}
print(DayOfWeek.monday) //這裏輸出的是什麼
複製代碼
經過運行得知,這裏輸出爲monday
。這裏須要注意的一點就是枚舉值
和RawValue
是兩個不一樣的東西
,好比咱們沒有辦法把一個枚舉值分配一個String
的變量,即便這個enum
是String
類型。 與此同時,咱們也沒辦法把一個具體類型的數據分配給具體的枚舉類型,好比以下例子報錯
因此上面
print
出來的就是具體的枚舉值
,而經過rawValue訪問
的就是rawValue
的get方法
。code
那咱們的枚舉是否是能夠像集合那樣遍歷?答案是能夠的orm
enum week:String {
case mon, tue, wed, thu, fri = "Hello", sat, sun
}
extension week:CaseIterable{}
var allCase = week.allCases
for c in allCase {
print(c)
}
複製代碼
打印以下遊戲
上面能夠看到隱式分配
會給每個Case
分配一個隱式值,可是有時候咱們並不想這麼作,或者有時候咱們想經過enum
來表達更復雜的例子,關聯更多的信息。這個時候咱們須要使用到關聯值了。 好比咱們經過枚舉值來表達一個形狀,有圓形,長方形,正方形。圓形有半徑,長方形有寬,高,這個時候關聯值就顯得很是有用了ci
enum Shape {
case circle(radius: Double)
case rectangle(width: Int, height: Int)
}
複製代碼
注意⚠️這裏咱們使用了關聯值以後,就沒有RawValue
。這裏也很是好理解,由於當前一個case
均可以有一組值來表示。 固然這裏的radius、height、width是咱們取的標籤,若是你不想寫,那就變成下面這樣:字符串
enum Shape {
case circle(Double)
case rectangle(Int, Int)
}
複製代碼
能夠經過如下方法建立一個有關聯值的枚舉值
enum Shape {
case circle(radius: Double)
case rectangle(width: Int, height: Int)
}
//******使用的時候也很是簡單,這裏就能夠直接給定值來建立一個關聯的枚舉值
var circle = Shape.circle(radius: 10.0)
var rectangle = Shape.rectangle(width: 10, height: 10)
//******也能夠從新分配值
circle = Shape.rectangle(width: 10, height: 10)
複製代碼
enum Week:String {
case MONDAY
case TUEDAY
case WEDDAY
case THUDAY
case FRIDAY
case SATDAY
case SUNDAY
}
let currentWeek:Week = .FRIDAY
switch currentWeek{
case .MONDAY: print(Week.MONDAY.rawValue)
case .TUEDAY: print(Week.TUEDAY.rawValue)
case .WEDDAY: print(Week.WEDDAY.rawValue)
case .THUDAY: print(Week.THUDAY.rawValue)
case .FRIDAY: print(Week.FRIDAY.rawValue)
case .SATDAY: print(Week.SATDAY.rawValue)
case .SUNDAY: print(Week.SUNDAY.rawValue)
}
複製代碼
使用Switch匹配enum的時候咱們必須列舉當前全部的狀況,否則編譯器就會報錯: 若是不想匹配這麼多的case,那麼咱們就可使用default關鍵字來表明默認的狀況
enum Week:String {
case MONDAY
case TUEDAY
case WEDDAY
case THUDAY
case FRIDAY
case SATDAY
case SUNDAY
}
let currentWeek:Week = .FRIDAY
switch currentWeek{
case .SATDAY, .SUNDAY: print("Happy Day")
default : print("Sad Day")
}
複製代碼
若是咱們要匹配關聯值的話
enum Shape {
case circle(radius: Double)
case rectangle(width: Int, height: Int)
}
let shape = Shape.circle(radius: 10.0)
switch shape{
/*這裏咱們作了Value-binding,也就意味着若是case匹配上,咱們至關於把10賦值給常量radious*/
case let .circle(radius):
print("Circle radius:\(radius)")
break
case let .rectangle(width, height):
print("rectangle width:\(width),height\(height)")
break
}
複製代碼
還能夠這麼寫
enum Shape {
case circle(radius: Double)
case rectangle(width: Int, height: Int)
}
let shape = Shape.circle(radius: 10.0)
switch shape{
case .circle(let radius):
print("Circle radius:\(radius)")
break
case .rectangle(let width, var height):
print("rectangle width:\(width),height\(height)")
break
}
複製代碼
有時候在業務邏輯處理中咱們只是想匹配單個case
,咱們能夠這樣寫
var circle = Shape.circle(radius: 10.0)
if case let Shape.circle(radius) = circle {
print("Circle radius:\(radius)")
}
複製代碼
若是咱們只關心不一樣case
的相同關聯值,咱們能夠這麼寫
enum Shape {
case circle(radius: Double, diameter: Double)
case rectangle(width: Double, height: Double)
case square(width: Double, width:Double)
}
let shape = Shape.circle(radius: 10.0, diameter: 20.0)
switch shape {
case let .circle(x, 20.0), let .square(x, 20.0):
print(x)
break
default:
break
}
複製代碼
或者使用通配符的方式:
let shape = Shape.circle(radius: 10.0, diameter: 20.0)
switch shape {
case let .circle(_, x), let .square(x, _):
print(x)
break
default:
break
}
/**/
switch shape{
case let .circle(x, y), let .square(y, x):
print("x = \(x),y = \(y)")
break
default:
break
}
複製代碼
好比咱們的遊戲案例,不一樣的案件組合會有不一樣的技能產生
enum CombineDirect{
//基礎按鍵就4個
enum BaseDirect{
case up
case down
case left
case right
}
//帶來的組合按鍵
case leftUp(combineElement1: BaseDirect, combineElement2: BaseDirect)
case rightUp(combineElement1: BaseDirect, combineElement2: BaseDirect)
case leftDown(combineElement1: BaseDirect, combineElement2: BaseDirect)
case rightDown(combineElement1: BaseDirect, combineElement2: BaseDirect)
}
//使用方式
let leftUp = CombineDirect.leftUp(combineElement1: CombineDirect.BaseDirect.left, combineElement2: CombineDirect.BaseDirect.up)
複製代碼
struct Skill{
enum KeyType{
case up
case down
case left
case right
}
let key: KeyType
func launchSkill(){
switch key {
case .left,.right:
print("left, right")
case .down,.up:
print("up, down")
}
}
}
複製代碼
enum中可以包含計算屬性
,類型屬性
,不能包含存儲屬性
,這裏簡單瞭解一下:
咱們也能夠在enum
中定義實例方法
,static
修飾的方法
enum Week:Int {
case MONDAY
case TUEDAY
case WEDDAY
case THUDAY
case FRIDAY
case SATDAY
case SUNDAY
mutating func nextDay(){
if self == .SUNDAY {
self = Week(rawValue: 1)!
}else{
self = Week(rawValue: self.rawValue + 1)!
}
}
}
var currentWeek:Week = .FRIDAY
print("old current \(currentWeek),rawValue \(currentWeek.rawValue)")
currentWeek.nextDay()
print("new current \(currentWeek),rawValue \(currentWeek.rawValue)")
print("end")
<------**輸出結果**---->
old current FRIDAY,rawValue 4
new current SATDAY,rawValue 5
end
複製代碼