swift-day06-枚舉

[swift-day06-枚舉]

  • Swift 中的枚舉更加靈活塑猖,不必給每一個枚舉成員提供一個值。如果給枚舉成員提供一個值(稱為“原始”值),則該值的類型可以是字符串距境,字符,或是一個整型值或浮點數(shù),使用enum關(guān)鍵詞來創(chuàng)建枚舉并且把它們的整個定義放在一對大括號內(nèi),這些枚舉成員的名字大寫字母開頭
  • 關(guān)聯(lián)值:Swift 枚舉來存儲任意類型的關(guān)聯(lián)值垮卓,如果需要的話垫桂,每個枚舉成員的關(guān)聯(lián)值類型可以各不相同。枚舉的這種特性跟其他語言中的可識別聯(lián)合(discriminated unions)粟按,標(biāo)簽聯(lián)合(tagged unions)诬滩,或者變體(variants)相似。
  • 原始值:在關(guān)聯(lián)值小節(jié)的條形碼例子中灭将,演示了如何聲明存儲不同類型關(guān)聯(lián)值的枚舉成員疼鸟。作為關(guān)聯(lián)值的替代選擇,枚舉成員可以被默認(rèn)值(稱為原始值)預(yù)填充庙曙,這些原始值的類型必須相同空镜。原始值可以是字符串,字符捌朴,或者任意整型值或浮點型值吴攒。每個原始值在枚舉聲明中必須是唯一的,原始值和關(guān)聯(lián)值是不同的。原始值是在定義枚舉時被預(yù)先填充的值砂蔽。對于一個特定的枚舉成員洼怔,它的原始值始終不變。關(guān)聯(lián)值是創(chuàng)建一個基于枚舉成員的常量或變量時才設(shè)置的值左驾,枚舉成員的關(guān)聯(lián)值可以變化
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        //******************************枚舉************************
        //Swift 中的枚舉更加靈活镣隶,不必給每一個枚舉成員提供一個值。如果給枚舉成員提供一個值(稱為“原始”值)诡右,則該值的類型可以是字符串安岂,字符,或是一個整型值或浮點數(shù),使用enum關(guān)鍵詞來創(chuàng)建枚舉并且把它們的整個定義放在一對大括號內(nèi),這些枚舉成員的名字大寫字母開頭
        enum CompassPonit {
             case North
             case South
             case East
             case West
            }
        //枚舉中定義的值(如 North稻爬,South嗜闻,East和West)是這個枚舉的成員值(或成員)。你使用case關(guān)鍵字來定義一個新的枚舉成員值
        //多個成員值可以出現(xiàn)在同一行上桅锄,用逗號隔開
        enum  CompassPonit1{
        
            case North,South,East, West
        
        }
        //directionToHead的類型可以在它被CompassPoint的某個值初始化時推斷出來琉雳。一旦directionToHead被聲明為CompassPoint類型样眠,你可以使用更簡短的點語法將其設(shè)置為另一個CompassPoint的值:
        var directionToHead = CompassPonit.West
        //當(dāng)directionToHead的類型已知時,再次為其賦值可以省略枚舉類型名翠肘。在使用具有顯式類型的枚舉值時檐束,這種寫法讓代碼具有更好的可讀性
        directionToHead = .East
        //使用switch語句匹配單個枚舉值
        switch directionToHead {
        case .North:
            print("North");
        case .East:
             print("East")
        case .South:
              print("South")
        case .West:
             print("west")
        
        
        }
        //關(guān)聯(lián)值:Swift 枚舉來存儲任意類型的關(guān)聯(lián)值,如果需要的話束倍,每個枚舉成員的關(guān)聯(lián)值類型可以各不相同被丧。枚舉的這種特性跟其他語言中的可識別聯(lián)合(discriminated unions),標(biāo)簽聯(lián)合(tagged unions)绪妹,或者變體(variants)相似甥桂。
        enum Barcode{
           case MARK1(Int,Int,Int)
           case MARK2(String,Int)
        }
        var pruduct = Barcode.MARK1(1, 2, 3)
        pruduct = .MARK2("hhh", 3)
        switch pruduct{
        case .MARK1(let number1, let number2,let number3):
            print("mark1:\(number1),\(number2),\(number3)");
        case .MARK2(let string , let number):
            print("mark2:\(string),\(number)")
        
        }
        //如果一個枚舉成員的所有關(guān)聯(lián)值都被提取為常量,或者都被提取為變量邮旷,為了簡潔黄选,你可以只在成員名稱前標(biāo)注一個let或者var
        switch pruduct{
        case let .MARK1(number1, number2, number3):
            print("mark1:\(number1),\(number2),\(number3)");
        case let .MARK2( string ,  number):
            print("mark2:\(string),\(number)")
            
        }
        //原始值:在關(guān)聯(lián)值小節(jié)的條形碼例子中,演示了如何聲明存儲不同類型關(guān)聯(lián)值的枚舉成員婶肩。作為關(guān)聯(lián)值的替代選擇办陷,枚舉成員可以被默認(rèn)值(稱為原始值)預(yù)填充,這些原始值的類型必須相同律歼。原始值可以是字符串民镜,字符,或者任意整型值或浮點型值险毁。每個原始值在枚舉聲明中必須是唯一的,原始值和關(guān)聯(lián)值是不同的制圈。原始值是在定義枚舉時被預(yù)先填充的值。對于一個特定的枚舉成員辱揭,它的原始值始終不變离唐。關(guān)聯(lián)值是創(chuàng)建一個基于枚舉成員的常量或變量時才設(shè)置的值,枚舉成員的關(guān)聯(lián)值可以變化
        enum testName:String{
          case one = "1"
          case two = "2"
          case three = "3"
        
        }
        //原始值的隱式賦值,在使用原始值為整數(shù)或者字符串類型的枚舉時问窃,不需要顯式地為每一個枚舉成員設(shè)置原始值,Swift 將會自動為你賦值
        //使用整數(shù)作為原始值時完沪,隱式賦值的值依次遞增1
        enum Planet:Int{
         
          case number1 = 1,number2,number3,number
        
        }
        //當(dāng)使用字符串作為枚舉類型的原始值時域庇,每個枚舉成員的隱式原始值為該枚舉成員的名稱。使用枚舉成員的rawValue屬性可以訪問該枚舉成員的原始值
        enum testPoint:String{
            case North
            case South
            case East
            case West
        
        }
        let planet1 = Planet.number.rawValue;
        let test1 = testPoint.North.rawValue;
        print("planet1 = \(planet1),test1 = \(test1)");//打印結(jié)果:planet1 = 4,test1 = North
        //如果在定義枚舉類型的時候使用了原始值覆积,那么將會自動獲得一個初始化方法听皿,這個方法接收一個叫做rawValue的參數(shù),參數(shù)類型即為原始值類型宽档,返回值則是枚舉成員或nil尉姨。你可以使用這個初始化方法來創(chuàng)建一個新的枚舉實例
        let possiblePlanet = Planet(rawValue: 3)
       //possiblePlanet 類型為 Planet? 值為 Planet.number3,并非所有Int值都可以找到一個匹配的行星。因此吗冤,原始值構(gòu)造器總是返回一個可選的枚舉成員又厉。在上面的例子中九府,possiblePlanet是Planet?類型,或者說“可選的Planet”覆致。
        print(possiblePlanet!)//打印結(jié)果:number3
        //遞歸枚舉:遞歸枚舉(recursive enumeration)是一種枚舉類型侄旬,它有一個或多個枚舉成員使用該枚舉類型的實例作為關(guān)聯(lián)值。使用遞歸枚舉時煌妈,編譯器會插入一個間接層儡羔。你可以在枚舉成員前加上indirect來表示該成員可遞歸。
        enum ArithmeticExpression{
           case NUmber(Int)
           indirect case Addition(ArithmeticExpression,ArithmeticExpression)
           indirect case Mutiplication(ArithmeticExpression,ArithmeticExpression)
         
        
        }
        //你也可以在枚舉類型開頭加上indirect關(guān)鍵字來表明它的所有成員都是可遞歸的
       indirect  enum ArithmeticExpression1{
            case NUmber(Int)
            case Addition(ArithmeticExpression1,ArithmeticExpression1)
            case Mutiplication(ArithmeticExpression1,ArithmeticExpression1)
            
            
        }
        //要操作具有遞歸性質(zhì)的數(shù)據(jù)結(jié)構(gòu)璧诵,使用遞歸函數(shù)是一種直截了當(dāng)?shù)姆绞?        func evaluate(expression:ArithmeticExpression)-> Int{
            
            switch expression {
            case .NUmber(let value):
                return value;
            case .Addition(let left, let right):
                return evaluate(left) + evaluate(right)
            case .Mutiplication(let left , let right):
                 return evaluate(left)*evaluate(right)
            
            }
        
        }
        //計算 (50+2)*10
        let five = ArithmeticExpression.NUmber(50)
        let four = ArithmeticExpression.NUmber(2)
        let sum = ArithmeticExpression.Addition(five, four)
        let product = ArithmeticExpression.Mutiplication(sum, ArithmeticExpression.NUmber(10))
        print("(50+2)*10 = \(evaluate(product))")//打印結(jié)果:(50+2)*10 = 520
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末汰蜘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子之宿,更是在濱河造成了極大的恐慌鉴扫,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澈缺,死亡現(xiàn)場離奇詭異坪创,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)姐赡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門莱预,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人项滑,你說我怎么就攤上這事依沮。” “怎么了枪狂?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵危喉,是天一觀的道長。 經(jīng)常有香客問我州疾,道長辜限,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任严蓖,我火速辦了婚禮薄嫡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘颗胡。我一直安慰自己毫深,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布毒姨。 她就那樣靜靜地躺著哑蔫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上闸迷,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天嵌纲,我揣著相機(jī)與錄音,去河邊找鬼稿黍。 笑死疹瘦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的巡球。 我是一名探鬼主播言沐,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼酣栈!你這毒婦竟也來了险胰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤矿筝,失蹤者是張志新(化名)和其女友劉穎起便,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窖维,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡榆综,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了铸史。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鼻疮。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖琳轿,靈堂內(nèi)的尸體忽然破棺而出判沟,到底是詐尸還是另有隱情,我是刑警寧澤崭篡,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布挪哄,位于F島的核電站,受9級特大地震影響琉闪,放射性物質(zhì)發(fā)生泄漏迹炼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一塘偎、第九天 我趴在偏房一處隱蔽的房頂上張望疗涉。 院中可真熱鬧,春花似錦吟秩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春壮池,著一層夾襖步出監(jiān)牢的瞬間偏瓤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工椰憋, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留厅克,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓橙依,卻偏偏與公主長得像证舟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子窗骑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

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