swift 笔记 (八) —— 枚举

枚举
在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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值