想必寫過程式的童鞋對列舉型別並不陌生吧,使用列舉型別的好處是多多的,在這兒就不做過多的贅述了。Fundation框架和UIKit中的列舉更是數不勝數,列舉可以使你的程式碼更易閱讀並且可以提高可維護性。在Swift語言中的列舉可謂是讓人眼前一亮。在Swift中的列舉不僅保留了大部分程式語言中列舉的特性,同時還新增了一些好用而且實用的新特性,在本篇部落格中將領略一些Swift中列舉型別的魅力。
有小夥伴會問,不就是列舉麼,有什麼好說的。在Swift中的列舉怎不然,Swift中的列舉的功能要強大的多,不僅可以給列舉元素繫結值,而且可以給列舉元素關聯多個值,同時還可以通過元素的值給一個列舉變數賦一個列舉值,並且列舉中可以定義列舉函式。下面將要開始窺探一下Swift中的列舉。
一、定義列舉
在Swift中列舉的定義與其他程式語言中定義列舉不同,在每個列舉元素前面多了一個關鍵字case, case後緊跟的是列舉元素,下面是定義列舉型別的兩種方式。
1. 多個case, 每個列舉元素前都有個case
1 2 3 4 5 6 7 8 |
//列舉的定義 enum KindOfAnimal { case Cat case Dog case Cow case Duck case Sheep } |
2.一個case搞定所有元素,列舉元素之間使用逗號隔開
1 2 3 4 |
//你也可以這樣定義列舉型別 enum KindOfAnimalTwo { case Cat, Dog, Cow, Duck, Sheep } |
二、列舉型別的使用
定義完列舉型別就是為了使用的對吧,直接使用列舉型別宣告變數即可, 在Swift中是不需要typedef來定義列舉型別的,我們可以直接使用列舉型別。
1 2 |
//定義列舉變數並賦值 var animal1: KindOfAnimal = KindOfAnimal.Cat |
給列舉變數賦值時也可以把列舉型別名省略掉,因為在宣告列舉變數時就已經指定了列舉變數的型別。
1 |
var animal2: KindOfAnimal = .Dog |
在Switch中使用我們的列舉變數
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//在Switch…Case中使用列舉 switch animal1 { case KindOfAnimal.Cat: println("Cat") case KindOfAnimal.Dog: println("Dog") case KindOfAnimal.Cow: println("Cow") case KindOfAnimal.Duck: println("Duck") case KindOfAnimal.Sheep: println("Sheep") default: println("error = 呵呵") } |
三、給列舉成員賦值
在Swift中宣告列舉時,是可以給每個列舉成員賦一個值的,下面的City列舉的成員就被指定了一個值,如下所示:
1 2 3 4 5 6 7 |
//給列舉賦值 enum City: String{ case Beijing = "北京" case ShangHai = "上海" case GuangZhou = "廣州" case ShengZhen = "深圳" } |
使用列舉變數的rawValue可以獲取給每個列舉成員賦的值,程式碼如下:
1 2 3 4 5 6 |
//定義列舉變數並賦值 var myInCity: City = City.Beijing //獲取列舉變數的值 var myInCityString: String = myInCity.rawValue; println(myInCityString) //輸出:北京 |
四、通過列舉成員的值給列舉變數賦值
什麼是通過列舉成員的值給列舉變數賦值呢?舉個例子,以上面的列舉型別City為例,假如我們只知道一個列舉成員的值是“北京”,而不知道“北京”這個值對應的列舉成員是”Beijing”, 在Swift中是可以通過“北京”這個值給列舉變數賦一個列舉成員“Beijing”的。
是不是有點繞啊,來點例項吧,下面就是通過列舉成員的原始值給列舉變數賦值的程式碼
1 2 |
//通過列舉成員的值,來給列舉成員賦值 var youInCity: City? = City(rawValue: "北京"); |
為啥我們的youInCity是可選值型別的呢?原因很簡單,我們不確定列舉City中的成員的值是否含有“北京”,列舉變數youInCity的值是不確定的,所以嘍是可選型別的,下面我們就取出youInCity的值,首先判斷youInCity是否為City.Beijing, 如果是,說明賦值成功就輸出值。
1 2 3 4 5 |
//取出youInCity中的值 if youInCity == City.Beijing { var cityName: NSString = youInCity!.rawValue println(cityName) //輸出:北京 } |
找一個列舉成員的值中不包含的字串用來給列舉變數賦值,觀察一下結果,下面的testCity的值列印出來為nil, 因為列舉中沒有一個成員的值為“京”。
1 2 3 4 5 |
//傳入一個列舉中沒有的值 var testCity: City? = City(rawValue: "京"); // testCity為nil println(testCity) |
五、列舉值自增
好東西還是要保留的,在Swift中的列舉值如果是整數的話,第一個賦值後,後邊的會自增的。關於列舉值自增就不多說了,直接看例項吧。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//列舉值自增 enum Hour: Int{ case One = 1 case Two case Three case Four case Five case Six case Seven case Eight } var hourTest: Int = Hour.Eight.rawValue println(hourTest) // hourTest = 8 |
六、列舉關聯值
什麼是列舉的關聯值呢?從字面意思上看是給列舉成員關聯一個值,沒錯,就是在給列舉變數賦值時,給列舉變數關聯一個值。在Swift中如何做的呢?就是在宣告列舉型別中的元素時使用小括號來制定關聯值的型別,然後在給列舉變數賦值的時候關聯一個或者多個值即可,直接看例項。
下面的程式碼是給iOS指定了兩個String型別的關聯值,在給列舉變數賦值的時候關聯兩個值。關聯這兩個值可以在Switch語句中進行使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//列舉的關聯值 enum mobileLanguage{ case IOS (String, String) case Android (String) } var iPhone: mobileLanguage = mobileLanguage.IOS("Objective-C", "Swift") switch iPhone { case mobileLanguage.IOS(let language1, let language2): println("language1 = (language1), language2 = (language2)") case mobileLanguage.Android(let temp): println(temp); default: println("NO") } //輸出結果:language1 = Objective-C, language2 = Swift |
七、列舉函式
在Swift中的列舉是可以新增函式的,有沒有眼前一亮呢。下面的程式碼段是在上面的關聯值程式碼的基礎上新增了一個描述函式,返回的就是當前列舉變數的列舉資訊,如下程式碼段所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//列舉函式 enum mobileLanguageFun{ case IOS (String, String) case Android (String) //定義列舉函式 var description: String{ switch self { case mobileLanguageFun.IOS(let language1, let language2): return "language1 = \(language1), language2 = \(language2)" case mobileLanguageFun.Android(let temp): return temp default: return ("NO") } } } var myMobile: mobileLanguageFun = mobileLanguageFun.IOS("objc", "swift") println(myMobile.description) //language1 = objc, language2 = swift |
今天的部落格內容也夠長了,就先到這兒吧,以後會繼續更新關於Swift內容的部落格的。
打賞支援我寫出更多好文章,謝謝!
打賞作者
打賞支援我寫出更多好文章,謝謝!