swift 筆記 (八) —— 枚舉
來源:互聯網
上載者:User
枚舉 在C語言中,枚舉的值只能是數字,在swift中,枚舉的值被叫做raw value,可以用String, Character, Int, Float等表示。
enum MyEnum {
}
例如: enum Seasons { case Spring case Summer case Autumn case Winnter } 或者也可以寫成: enum Seasons { case Sprint, Summer, Autumn, Winnter }
定義好了枚舉之後,枚舉的名字就和我們之前見過的其它類型類(Int, String ......)似了,可以像其它類型一樣使用,所以 官方文檔中建,在定義enum的時候,枚舉類型的首字母要大寫,比如上面定義的Seasons的第一個s是大寫。
既然是類型,那麼我們可以用enum定義變數:
var mySeason = Seasons.Spring
當初始化完 mySeason之後(此時 mySeason的類型就是 Seasons了),就可以直接使用枚舉值賦值,而不需要再寫枚舉的類型: mySeason = .Winnter //舉枚值前面的"."不可以省略
在switch中也是類似:
switch mySeason { case .Spring: println("春") case .Summer: println("夏") case .Autumn: println("秋") case .Winnter: println("冬") default: println("季節賦值錯了。") }
當switch的case中列出了enum的所有值時,default就不再需要寫了,Xcode也不會提示,但是如果沒寫全,也沒寫default的時候,Xcode會提示“Switch must be exhaustive, consider adding a default clause”
還可以讓enum的值為一個 自訂類型(官方的例子): enum Barcode { case UPCA(Int, Int, Int) case QRCode(String) }
但要注意的是,在上面的這個定義中,Barcode並不會儲存任何Int和String,而僅僅是定義了一個類型,我們仍然需要再定義一個額外的變數,用於儲存需要的資訊: var productBarcode = Barcode.UPCA(8, 85909_51226, 3)
或者用二維碼錶示這個productBarcode變數: productBarcode = .QRCode(“ABCSDFGQWERQWF”)
這個productBarcode變數,實際上是個 Barcode類型(上面定義的那個舉枚), 所以,可以給他賦值成 .UPCA 或者 .QRCode
在《控制流程》那部分中,我們看到過 swith的case中使用let的用法,對於Barcode這個enum的switch,我們就可以使用let的方法:
switch productBarcode { case .UPCA( let numberSystem, let identifier, let check): //這裡可以對 numberSystem, identifier, check 做操作 case .QRCode( let productCode): //這裡可以對 productCode做操作 } //上面提到過了,switch中,如果所有的case都已經列出過了,就不需要再用default了
在《控制流程》那部分,我們還提到過,如果case中的所有值都是變數的話,可以把let 寫在前面:
switch productBarcode { case let .UPCA(numberSystem, identifier, check): //這裡可以對 numberSystem, identifier, check 做操作 case let .QRCode( productCode): //這裡可以對 productCode做操作 }
Raw Values 可以為enum定義值,叫做Raw Values, 可以是Int, String, Double等等基本類型:
enum Planet: Int { case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune }
此時, Planet這個枚舉的Raw value就是整型,只要給定一個值後,其後的值的raw value會逐一遞增: Planet.Venus 的raw value是2, Planet.Earth的raw value是3…
var earthOrder = Planet.Earth .toRaw() //注意 toRaw()這個方法 這樣可以取到枚舉值的raw value
也可以通過raw value取到枚舉值: var whichPlanet = Planet .fromRaw(2) //注意fromRaw()這個方法是接在枚舉類型後面的,與toRaw() 不同
值得注意的是, 按著上面的定義,如果我們用 Planet.fromRaw(100000)取到的值是什麼。顯然這個值並沒有定義,所以,fromRaw()這個方法,傳回值是 optional的,所以,whichPlanet 這個變數的類型是 Planet? 或者 optional Planet