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



相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.