Swift-->枚舉

心情有沒(méi)有好一點(diǎn)

在介紹枚舉之前我們先了解一下Swift中 關(guān)于面向?qū)ο蟮念愋?/strong>

Swift中不僅提供了 面向過(guò)程的編程支持,也提供了全面的面向?qū)ο?/code>的支持,與普通的面向?qū)ο蟮木幊陶Z(yǔ)言(只支持類)不同烹吵,Swift可以定義枚舉拯欧,結(jié)構(gòu)體详囤,類 3種面向?qū)ο蟮念愋停ɑ騭wift類型)、這三種類型镐作,都可以被認(rèn)為是一種該自定義的數(shù)據(jù)類型藏姐,可以被枚舉,結(jié)構(gòu)體该贾,類來(lái)定義變量羔杨,其中 枚舉結(jié)構(gòu)體值類型,使用定義的變量則是引用類型

實(shí)例和對(duì)象的關(guān)系
在Swift中杨蛋,實(shí)例和對(duì)象是不同的兜材, 只有類的實(shí)例 才能成為對(duì)象,而結(jié)構(gòu)體和枚舉實(shí)例則只能稱為 實(shí)例逞力,不能成為對(duì)象

在這三種程序單元的內(nèi)部曙寡,分別可以定義屬性(存儲(chǔ)屬性,計(jì)算屬性)寇荧、方法卵皂、構(gòu)造器、下標(biāo)砚亭、嵌套類型(包括嵌套類灯变、嵌套結(jié)構(gòu)體、嵌套枚舉)5中類型成員

現(xiàn)在進(jìn)入正題

1捅膘、枚舉的定義和特點(diǎn)

Swift中枚舉:是一種重新定義的類型:和所有的語(yǔ)言的功能類似
作用:主要用于管理一組有限的值的集合
特點(diǎn):
1.具有面向?qū)ο蟮奶卣?br> 2.支持計(jì)算屬性
3.支持實(shí)例方法和類型方法
4.允許枚舉遵守指定協(xié)議來(lái)提供標(biāo)準(zhǔn)的功能
格式:
enum 枚舉名 {
//使用case關(guān)鍵字列出所有的枚舉值
//枚舉的其他成員
}

//枚舉的定義
    enum Season{
        case Spring 
        case  Summer 
        case  Fall
        case  Winter
    }
  • 上面枚舉中定義了4個(gè)枚舉值添祸,每個(gè)枚舉值使用一個(gè)case定義
  • 我們也可以使用一個(gè)case 定義多個(gè)枚舉值
enum Weekly {
        //使用一個(gè)case列出多個(gè)枚舉值
        case Monday,Tuesday,Wednesday,Thursday,Firday,Saturday,Sunday
    }

2、枚舉的使用

與C寻仗、OC的枚舉不同刃泌,Swift的枚舉成員不會(huì)被分配一個(gè)默認(rèn)的整數(shù)值,
【重點(diǎn)】也就是說(shuō),Swift的枚舉名本身就代表一個(gè)枚舉實(shí)例耙替,對(duì)應(yīng)一個(gè)枚舉值亚侠,與整數(shù)值沒(méi)有任何關(guān)系,
定義了Swift的任意類型之后俗扇,大致可從如下幾個(gè)方面來(lái)使用該類型
1->聲明變量
2->創(chuàng)建實(shí)例
3->訪問(wèn)類型屬性
4->調(diào)用類型方法
5->派生子類硝烂。但Swift中 只有類才支持繼承,枚舉和結(jié)構(gòu)體都不支持繼承铜幽,因此枚舉和結(jié)構(gòu)體都不能派生子類
【注意】:這5中功能滞谢,是面向?qū)ο蟮目偩V,以后無(wú)論學(xué)習(xí)任何面向?qū)ο蟮木幊陶Z(yǔ)言的時(shí)候除抛,有了類之后狮杨,大致上都是使用上面列出的5種功能

         //1->聲明
        var day:Weekly
        //2->創(chuàng)建實(shí)例
        //使用已有的枚舉實(shí)例賦值(因?yàn)槊杜e名本身就代表一個(gè)枚舉實(shí)例,所以不需要?jiǎng)?chuàng)建實(shí)例)
        day = Weekly.Firday
        print(day)

  • 在定義day的時(shí)候已經(jīng)知道了day的類型 所以在后面使用的時(shí)候 可以省略 前面的類型
        day =  .Firday

3到忽、枚舉和Switch語(yǔ)句

【注】因?yàn)镾witch語(yǔ)言中橄教,Switch語(yǔ)句 必須是完備的,也就是說(shuō)Switch語(yǔ)句的case必須覆蓋所有可能的情況,否則最后必須添加default語(yǔ)句

let chooseDay = Weekly.Monday
 switch chooseDay {
        case  .Monday :
            print("1")
        case  .Tuesday:
            print("2")
        case  .Wednesday:
           print("3")
        case .Thursday :
            print("4")
        case .Firday:
            print("5")
        case .Saturday:
            print("6")
        case .Sunday:
            print("7")
       }

因?yàn)樯厦娉绦蛑械腸ase已經(jīng)覆蓋了 所有枚舉值喘漏,所以switch語(yǔ)句可以省略颤陶,default 分支,當(dāng)然也可以添加上:只是會(huì)報(bào)個(gè)警告Default will never be executed
哦陷遮,對(duì)了 如果 你運(yùn)行的時(shí)候滓走,在switch chooseDay { 這行報(bào)警告Switch condition evaluates to a constant的話,可以把要聲明的變量放到函數(shù)外

3帽馋、原始值

有點(diǎn)類似于搅方,C、OC的枚舉绽族,通過(guò)原始值可以為每個(gè)枚舉實(shí)例指定一個(gè)簡(jiǎn)單類型姨涡,如Int Double String等
語(yǔ)法:enum 枚舉名 : 原始值類型 {
case 枚舉值 = 原始值
}

  • 【注】 Swift并不要對(duì)每個(gè)枚舉值都指定,原始值吧慢。
    Swift可以根據(jù)已指定的原始值涛漂,推斷出它前后的所有枚舉值
  • 原始值為:Int 類型
  enum weekDay2 :Int {
        case Monday=1,Tuesday,Wednesday=5,Thursday,Firday,Saturday,Sunday
    }
    //可以推斷,Tuesday的原始值為2 Thursday=6  Firday=7
  • 原始值為:String類型

  • Swift也可以為 枚舉值分配隱式的原始值--隱式的原始值與變量名同名

  • 這里程序只為L(zhǎng)eft 顯式分配了原始值检诗,意味著只有l(wèi)eft的原始值是“Left” 其余的原始值 都是隱式原始值匈仗,也就是“Up”,"Down","Right"

【注】枚舉要么完全不指定原始值,要么所有枚舉都具有原始值逢慌,為了讓所有的枚舉都有原始值悠轩,即可讓系統(tǒng)自動(dòng)推斷,也可指定顯示指定

 enum  Orientation :String {
        case Up ,Down,Left="左",Right
    }

現(xiàn)在已經(jīng)有了 原始值 攻泼,接下來(lái)即可使用枚舉提供的如下的構(gòu)造器和屬性
init?(rawValue:):可能失敗的構(gòu)造器:根據(jù)原始值返回對(duì)應(yīng)的枚舉值
hashValue:根據(jù)枚舉值 獲得原始值

 let  Orient = Orientation.Up
        print("\\(Orient.hashValue)")//通過(guò)枚舉值-->原始值 
//輸出Up 
  let MyOrient = Orientation(rawValue:"左") //原始值 --> 枚舉值
        //因?yàn)閕nit?(rawValue:)是一個(gè) 可能失敗的構(gòu)造器 所以要執(zhí)行可選綁定
        if let newOrient = MyOrient {
            print(newOrient)
        }
//輸出 Left 
        print("\\(Orient.hashValue)")//Orient.hashValue 獲取哈希值
//輸出 0 

4火架、 關(guān)聯(lián)值

枚舉除了可以定義一組鉴象,枚舉成員之外,還可以為枚舉成員定義一組關(guān)聯(lián)值何鸡,--Swift并不要求各枚舉 具有相同的關(guān)聯(lián)值纺弊,關(guān)聯(lián)值就是枚舉實(shí)例攜帶的一些額外的數(shù)據(jù),有點(diǎn)類似于枚舉值的屬性骡男。
語(yǔ)法: 語(yǔ)法:case 枚舉值(元組語(yǔ)法)

 enum Planet  {
        case Mercury (weight:Double ,density:Double,name:String)
        case Venus (Double ,Double)
        case Jupiter
    }
    //Mercury  Venus攜帶關(guān)聯(lián)值淆游,而且Mercury的關(guān)聯(lián)值還指定了名稱,雖然指定了名稱但是洞翩,程序依然無(wú)法向訪問(wèn)元組成員一樣訪問(wèn)關(guān)聯(lián)值

    var p1 = Planet.Mercury(weight: 10, density: 10, name: "lpx")
  • 【注】:當(dāng)程序?yàn)槊杜e值 指定了 關(guān)聯(lián)值之后稽犁,程序使用這些枚舉值的時(shí)焰望,必須指定它的關(guān)聯(lián)值骚亿。

** 關(guān)聯(lián)值的訪問(wèn)**

  • 枚舉中的關(guān)聯(lián)值:需要聲明額外的變量(常量),并將枚舉的關(guān)聯(lián)值綁定到這些變量或常量
        //【注】如果程序打算將某個(gè)枚舉值的所有關(guān)聯(lián)值都提取為變量或常量熊赖,也可只將一個(gè)var来屠、let 放置在枚舉成員的前面。
        //eg:   case let .Mercury(weight, density, last ):
        switch p1 {
            //這里就相當(dāng)于 元組值的綁定
        case  Planet.Mercury(let weight , let density,let name ):
            print("weight= \\(weight) density=\\(density) name=\\(last)")
        default :
            print("")
        }
//輸出 weight= 10.0 density=10.0 name=lpx

5震鹉、枚舉的函數(shù)用法(【用的比較少】【而且沒(méi)有提示】)

對(duì)于有關(guān)聯(lián)值的枚舉俱笛,甚至可以被當(dāng)做函數(shù)使用,該函數(shù)總是可以根據(jù)關(guān)聯(lián)值創(chuàng)建對(duì)應(yīng)的枚舉實(shí)例传趾,與普通函數(shù)類似的是迎膜,可作為函數(shù)使用的枚舉,也可以被賦值給函數(shù)類型的變量浆兰,

  let fn = Planet.Venus//將Planet.Venus賦給fn變量 得知fn是一個(gè)類型為(Double,Double)->Planet的函數(shù)
        let g1 = fn(10,10)//返回的就是關(guān)聯(lián)值為 10磕仅,10的Venus的枚舉值與直接獲取的Planet.Venus(10, 10)的結(jié)果相同
        print(g1)
        
        let g2 = Planet.Venus(10, 10)
        print(g2)//這兩個(gè)輸出的一樣的  Venus(10.0, 10.0)

6、遞歸枚舉

在有些情況下簸呈,枚舉值所包含的關(guān)聯(lián)值類型 又是該枚舉本身榕订,此時(shí)就形成了遞歸枚舉,

  enum Weekly2 {
    indirect   case Monday (next:Weekly2)
        case Tuesday (String)
        case  Wednesday
        case Thursday
        case  Firday
   indirect  case  Saturday(next:Weekly2)
        case Sunday
    }
  • Swift也支持用 indirect 修飾枚舉本身蜕便,把indirect放到enum前面劫恒,這就相當(dāng)于 在每個(gè)枚舉值的case前都是用了indirect
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市轿腺,隨后出現(xiàn)的幾起案子两嘴,更是在濱河造成了極大的恐慌,老刑警劉巖族壳,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溶诞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡决侈,警方通過(guò)查閱死者的電腦和手機(jī)螺垢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門喧务,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人枉圃,你說(shuō)我怎么就攤上這事功茴。” “怎么了孽亲?”我有些...
    開(kāi)封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵坎穿,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我返劲,道長(zhǎng)玲昧,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任篮绿,我火速辦了婚禮孵延,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘亲配。我一直安慰自己尘应,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布吼虎。 她就那樣靜靜地躺著犬钢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪思灰。 梳的紋絲不亂的頭發(fā)上玷犹,一...
    開(kāi)封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音洒疚,去河邊找鬼歹颓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拳亿,可吹牛的內(nèi)容都是我干的晴股。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼肺魁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼电湘!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起鹅经,我...
    開(kāi)封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤寂呛,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后瘾晃,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體贷痪,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蹦误,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了劫拢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肉津。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖舱沧,靈堂內(nèi)的尸體忽然破棺而出妹沙,到底是詐尸還是另有隱情,我是刑警寧澤熟吏,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布距糖,位于F島的核電站,受9級(jí)特大地震影響牵寺,放射性物質(zhì)發(fā)生泄漏悍引。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一帽氓、第九天 我趴在偏房一處隱蔽的房頂上張望趣斤。 院中可真熱鬧,春花似錦杏节、人聲如沸唬渗。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至壮啊,卻和暖如春嫉鲸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背歹啼。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工玄渗, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狸眼。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓藤树,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親拓萌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子岁钓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 枚舉為一組相關(guān)的值定義了一個(gè)共同的類型,使得可以在代碼中以類型安全的方式來(lái)使用這些值微王。 如果熟悉 C 語(yǔ)言屡限,會(huì)知道...
    窮人家的孩紙閱讀 851評(píng)論 1 4
  • title: "Swift 中枚舉高級(jí)用法及實(shí)踐"date: 2015-11-20tags: [APPVENTUR...
    guoshengboy閱讀 2,559評(píng)論 0 2
  • 枚舉定義一組相關(guān)值的公共類型,并允許您在代碼中以類型安全的方式使用這些值炕倘。 如果你熟悉C钧大,你會(huì)知道C枚舉分配相關(guān)的...
    Joker_King閱讀 257評(píng)論 0 0
  • Swift 中枚舉的特點(diǎn): 不必給每一個(gè)枚舉成員提供一個(gè)值。(枚舉的 case 默認(rèn)就是一個(gè)值) 枚舉的值可以是 ...
    Laughingg閱讀 618評(píng)論 0 0
  • 第四章 第二小節(jié)
    ALIVEANDDONE閱讀 176評(píng)論 0 0