枚舉:
其實大家都耳熟能詳了,多種語言都有,可能大家使用的頻率不一樣罷了.
簡介:
枚舉為一系列相關聯的值定義一個公用的資料類型,同時能夠讓你在編程的時候在型別安全的情況下去使用這些值.
比如:周,月份等等
Switch 就更不用說了,只不過,Swift的Switch太強大了,強大到你驚訝.嘻嘻...
史上最強大的Switch來襲
請看Code+注釋:
//// ViewController.swift// enum with switch//// Created by NapoleonBai on 14-11-17.// Copyright (c) 2014年 NapoleonBai. All rights reserved.//import UIKit/**定義枚舉<枚舉的定義:關鍵字:enum>*/enum DAYOFWEEK{ //從周一到周日 case MONDAY case TUESDAY case WEDNESDAY case THURSDAY case FRIDAY case SATURDAY case SUNDAY //採用關鍵字case來標記定義了一個新的枚舉成員變數(或者說是成員) /* 注意:與C或者Objective-C不同的是,在Swift語言中枚舉類型的成員初始的時候不會被預設賦值成整數值,在這裡,MONDEY,...SUNDAY預設不會隱式的等於0,1,2... 6。取而代之的是不同的枚舉成員將要用什麼類型以及賦值什麼值都是可以自己控制的,可以在定義DAYOFWEEK這個枚舉的時候指定. */ //當然了,也許你會問,那麼可以唯寫一個case不?答案是允許的 //eg: /* case MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY //這樣的寫法跟上面一樣,這樣寫就節省了case,只需用,號隔開就行 */ //至於在初始化指定值,那麼就是這樣的 //eg: /* enum DAYOFWEEK : Int{ case MONDAY = 0 ...} 注意:只有當類型為整型的時,才會自增長,其他類型不會 */}//枚舉的其他類型enum OtherEnum{ //採用元組進行定義 case ERRORCODE(Int,String) case ERRORTYPE(String)}class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. //調用:傳入sunday self.managerEnum(DAYOFWEEK.SUNDAY) //傳入Wednesday self.managerEnum(DAYOFWEEK.WEDNESDAY) //上述調用輸出: //今天:星期日 //今天:星期三 self.managerEnumOther(OtherEnum.ERRORCODE(404, "NOT FOUND")) //error code = 404 ,message = NOT FOUND self.managerEnumOther(OtherEnum.ERRORTYPE("路徑未找到")) //errortype = 路徑未找到 } //此函數用來管理枚舉 func managerEnum(mdayOfWeek : DAYOFWEEK){ //上面定義了一個枚舉,是定義的周一到周末七個變數,這裡我們將使用一下試試效果 /* 說明: 如果採用switch來進行枚舉選擇輸出,那麼就需要把枚舉中得所有成員變數都要考慮到,否則編譯不通過 因為mdayOfWeek是DAYOFWEEK類型,所以可以直接使用.SUNDAY進行輸出 */ //eg: //用來確定是周幾 var todayOfWeek = "星期日"; switch mdayOfWeek{ case .SUNDAY: todayOfWeek = "星期日" case .MONDAY: todayOfWeek = "星期一" case .TUESDAY: todayOfWeek = "星期二" case .WEDNESDAY: todayOfWeek = "星期三" break case .THURSDAY: todayOfWeek = "星期四" break case .FRIDAY: todayOfWeek = "星期五" break case DAYOFWEEK.SATURDAY: todayOfWeek = "星期六" break default: break } println("今天:\(todayOfWeek)") /* 此處應該說點什麼: switch吧,在Swift中Switch得到了增強,可以看到,上面的case語句中,有得並沒有增加break, 是不是習慣性地回想:這樣是不是會執行完一個,繼續執行下一個呢?直到遇到break再跳出. 答案是:swift中,編譯器在case中自動增加了break語句,每次一個case執行完畢,就自動break,所一個,加不加break都是一樣的 那麼,如果有需求是需要執行兩個或更多呢?那又怎麼辦? 那我們看下面: */ //eg: managerSwitch(2) //輸出: /* 這是2 這是3 這是4 */ managerSwitch(4) //這是4 //這樣就很容易的看出來,如果想要繼續執行下一個case語句,那麼就需要fallthrough的幫忙了,一定要記得呀 //嘻嘻 //那麼,如果有需求是這樣滴: //周一到周三公司上班,周四,周五齣差,周六,周日休息,那麼怎麼做了, //是不是會想到上面的那個方法?其實,swif提供了一個更加爽朗的方式,請看 //eg: managerSwitchTwo(DAYOFWEEK.FRIDAY) managerSwitchTwo(DAYOFWEEK.THURSDAY) managerSwitchTwo(DAYOFWEEK.TUESDAY) /* 依次列印: 出差啦.... 出差啦.... 公司上班 */ //注意: /* 需要注意的地方有兩點: Switch當然也支援顯式的break,通常只有一種情況下會這麼做,那就是當你也不想在default裡做任何事情的時候,這個時候你就可以在default裡顯式地加上一句break。 fallthrough並不是在任何情況下都有效,當你在Switch裡使用Value Binding技術的時候,fallthrough就被禁止了。 至於什麼是Value Binding,等會兒在道來了。稍候一會啦.... */ /* 史上最強大的switch:Swift中的Switch java Switch不支援字串,但也可以採用枚舉替代,OC中就更不支援了 但是:swift就不一樣了,它支援字串,浮點型,boolean型,等諸多資料類型,甚至支援元群組類型 那麼,請看下面啦 */ //eg: //區間值: var numOne = 50 switch numOne { case 0 ... 100: println("0~100") //輸出:0~100 case 101 ... 200: println("101~200") default: "default" } //關於區間,使用" ... "來充當,上面的case中,很容易看出來,1-100之間的數,就在case 0 ... 100中截取 //關於元組: let request = ("status","success") switch request { case ("status", "success"): println("success") //輸出:success case ("status", "failed"): println("failed") default: "default" } //當然,元組有多種形式,可以添加很多資料類型的值,如果不懂的話,可以移步到元組欄仔細瞅瞅 //比如:跳過不關心的值 //eg: let (name, _, age) = ("NapoleonBai" ,true, 22) //到這裡,差點忘記上面說的value binding了,那麼這裡就借元組來說明一下下啦 //當然,針對元組,Switch還支援類似於Optional Binding的Value Binding,就是能把元組中的各個值提取出來,然後直接在下面使用 let requestCode = (404,"NOT FOUND") switch requestCode { case (404, let state): println(state) //輸出:NOT FOUND //fallthrough //error:'fallthrough' cannot transfer control to a case label that declares vaiables case (let errorCode, _): println("error code is \(errorCode)") } //這樣,就是一個VAlue Binding技術的使用了,這樣就不能使用fallthrough了,如果使用的話,編譯器直接拋出上面那個error:就通不過編譯了,至於要怎麼完成上面的那個繼續執行下一個case,那麼就需要自己另行想辦法了...嘻嘻 } //講解switch func managerSwitch(num : Int){ switch num{ case 1: println("這是1") fallthrough case 2: println("這是2") fallthrough case 3: println("這是3") fallthrough case 4: println("這是4") case 5: println("這是5") default: println("其他") } } //swith的其他動作 func managerSwitchTwo(day : DAYOFWEEK){ switch day{ case .MONDAY,.TUESDAY,.WEDNESDAY: println("公司上班") case .THURSDAY,.FRIDAY: println("出差啦....") default: println("休息") } } //列印其他枚舉 func managerEnumOther(otherEnum : OtherEnum){ switch otherEnum{ case .ERRORCODE(let code, let message): println("error code = \(code) ,message = \(message)") case .ERRORTYPE(let typeInfo): println("errortype = \(typeInfo)") } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. }}
最後在介紹一點點啦:
我們可以使用枚舉的toRaw()函數來擷取它的初始值,當然,要有初始值才行哈
既然都有通過成員變數來擷取其初始值,那麼也就有通過初始值來尋找成員變數的名稱吧:
那就是fromRaw()函數,如果根據初始值沒有找到,那麼就會返回nil,而且注意,這裡找到的都是非強制類型的資料,當然,
這裡,就暫時把非強制類型理解為一個Object物件類型吧.以後再講解... ...
一天一點,周末休息..嘻嘻