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