枚舉(Enumeration):
枚舉在Swift中是 first-class types威始。與C棒搜,Objective-C中的枚舉相比,Swift中枚舉功能更強(qiáng)大。它支持很多只有類才有的特性八千,如: Properties, Methods与殃, Initialization母赵, Extensions, [Protocols]
1.語法格式
enum EnumName{
case
case
case
...
}
基本的枚舉類型
enum Weight {
case light
case Mid
case Heavy
}
注意:
與C和Objective-C不同授药,Swift枚舉情況在創(chuàng)建時(shí)不分配默認(rèn)整數(shù)值士嚎。在Weight例子中,light悔叽,Mid和Heavy不等于隱式0莱衩,1和2。
OC的枚舉值只支持Int一種類型娇澎,Swift的枚舉值支持四種類型
整型(Integer)
浮點(diǎn)數(shù)(Float Point)
字符串(String)
布爾類型(Boolean)
對于Int
類型的枚舉
enum Weight : Int {
case light = 0
case Mid = 1
case Heavy = 2
}
使用枚舉的rawValue
屬性來訪問其原始值:
let weight = Weight.light.rawValue
let middle = Weight.Mid.rawValue
let heavy = Weight.Heavy.rawValue
控制臺(tái)輸出:weight=0,middle=1,heavy=2
其實(shí)對于Int
類型的枚舉笨蚁,不必為每種case顯示分配原值,Swift將自動(dòng)
為其分配值,每個(gè)case原始值依次加1
九火,上面的寫法可以寫成
enum Weight : Int {
case light = 0
case Mid
case Heavy
}
再簡單一點(diǎn)可以這樣寫:
enum Weight : Int {
case light = 0,Mid , Heavy
}
假設(shè)我們不設(shè)置第一個(gè)case值赚窃,如下
enum Weight : Int {
case light ,Mid , Heavy
}
控制臺(tái)輸出結(jié)果不變:weight=0,middle=1,heavy=2
這是因?yàn)榈谝粋€(gè)case值
默認(rèn)
為0
對于字符串
類型的枚舉成員,舉例如下:
enum DogName:String{
case taidi = "taidi"
case fadou = "fadou"
case jinmao = "jinmao"
}
let taidi = DogName.taidi.rawValue
let fadou = DogName.fadou.rawValue
let jinmao = DogName.fadou.rawValue
控制臺(tái)輸出:taidi=taidi,fadou=fadou,jinmao=fadou
對于
字符串
的枚舉成員岔激,隱式原始值
為該枚舉成員變量的名稱勒极,也就是說,上面的寫法等同于
enum DogName:String{
case taidi
case fadou
case jinmao
}
在某種情況下虑鼎,我們需要根據(jù)
raw
值去找我們的成員變量
enum Weight : Int {
case light = 0
case Mid = 1
case Heavy = 2
}
let mid = Weight(rawValue: 1)
print(mid)
輸出:Optional(Constructor.Weight.Mid)辱匿,其中Constructor是工程名,Weight是枚舉名稱
從Optional可以看出返回值是可選類型炫彩,這樣就避免了傳入不存在的raw值匾七,如
let noData = Weight(rawValue: 3)
print(noData)
輸出為:nil
2.嵌套枚舉
如果你有特定子類型的需求,可以對enum
進(jìn)行嵌套江兢。這樣就允許你為實(shí)際的enum
中包含其他明確信息的enum
昨忆。以狗狗類型為例,每個(gè)狗狗都吃食物杉允,都有玩具邑贴,因此所有類型的狗都可以獲取同一個(gè)食物集合席里。而其他類型的狗則無法吃這些食物(比如金毛只能啃饅頭)。
enum Dog {
enum Food {
case noodles
case dumpling
case meat
}
enum Toys{
case basketball
case football
}
case taidi
case faniu
}
現(xiàn)在拢驾,你可以通過層級(jí)結(jié)構(gòu)
來描述狗狗允許訪問的項(xiàng)目條奖磁。
let pet = Dog.taidi
let food = Dog.Food.dumpling
let toys = Dog.Toys.football
3.迭代枚舉
當(dāng)需要迭代枚舉中的所有
情況時(shí),需要自定義的枚舉遵守CaseIterable
協(xié)議
enum Dog:CaseIterable {
case jinmao
case taidi
case faniu
}
let numOfDogKind = Dog.allCases.count
print("numOfDogKind = \(numOfDogKind)")
//numOfDogKind = 3
for dogKind in Dog.allCases{
print(dogKind)
}
//jinmao
//taidi
//faniu
4.關(guān)聯(lián)值(Associated Values)
我們可以定義Swift枚舉來存儲(chǔ)任何給定類型的關(guān)聯(lián)值繁疤,而且每種枚舉情況的值類型可以不同咖为。
enum Pet{
//名字和年齡
case dog(String,Int)
//體重
case cat(Float)
}
var result = Pet.dog("老七", 3)
result = Pet.cat(2.0)
print(result)
switch result {
case .dog(let name, let age):
print("dog: name = \(name), age = \(age).")
case .cat(let weight):
print("cat: weight = \(weight)公斤")
如果一個(gè)枚舉成員的所有關(guān)聯(lián)值都被提取為常量,或者都被提取為變量稠腊,為了簡潔躁染,你可以只在成員名稱前標(biāo)注一個(gè)let或者var:
switch result {
case let .dog(name,age):
print("dog: name = \(name), age = \(age).")
case let .cat(weight):
print("cat: weight = \(weight)公斤")
}
5.包含枚舉(Containing Enums)
同樣地,你也能夠在structs或classes中內(nèi)嵌枚舉麻养。舉例:
struct Dog {
enum DogKind {
case jinmao
case taiji
case fadou
}
enum Food {
case noodles
case dumpling
case meat
}
let kind : DogKind
let food : Food
}
let dog = Dog(kind: .fadou, food: .dumpling);
if case let newDog = dog {
print(newDog.kind)
}
//fadou
同樣地褐啡,這也將有助于我們將相關(guān)的信息集中在一個(gè)位置。