swift 枚舉(enum)使用

枚舉(Enumeration):

枚舉在Swift中是 first-class types威始。與C棒搜,Objective-C中的枚舉相比,Swift中枚舉功能更強(qiáng)大。它支持很多只有類才有的特性八千,如: PropertiesMethods与殃, 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
image.png

控制臺(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
image.png

控制臺(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è)位置。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鳖昌,一起剝皮案震驚了整個(gè)濱河市备畦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌许昨,老刑警劉巖懂盐,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異糕档,居然都是意外死亡莉恼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門速那,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俐银,“玉大人,你說我怎么就攤上這事端仰〈废В” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵荔烧,是天一觀的道長吱七。 經(jīng)常有香客問我,道長鹤竭,這世上最難降的妖魔是什么踊餐? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮臀稚,結(jié)果婚禮上吝岭,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好苍碟,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布酒觅。 她就那樣靜靜地躺著撮执,像睡著了一般微峰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抒钱,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天蜓肆,我揣著相機(jī)與錄音,去河邊找鬼谋币。 笑死仗扬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蕾额。 我是一名探鬼主播早芭,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼诅蝶!你這毒婦竟也來了退个?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對情侶失蹤调炬,失蹤者是張志新(化名)和其女友劉穎语盈,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缰泡,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刀荒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了棘钞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缠借。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖宜猜,靈堂內(nèi)的尸體忽然破棺而出泼返,到底是詐尸還是另有隱情,我是刑警寧澤宝恶,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布符隙,位于F島的核電站,受9級(jí)特大地震影響垫毙,放射性物質(zhì)發(fā)生泄漏霹疫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一综芥、第九天 我趴在偏房一處隱蔽的房頂上張望丽蝎。 院中可真熱鬧,春花似錦、人聲如沸屠阻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽国觉。三九已至吧恃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間麻诀,已是汗流浹背痕寓。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蝇闭,地道東北人呻率。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像呻引,于是被迫代替她去往敵國和親礼仗。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348