一.枚举语法
enum 枚举名{
case:枚举名
case:枚举名
case:枚举名
enum CompassPoint {
case north
case south
case east
case west
}
var directionToHead = CompassPoint.west
当directionToHead被初始化的时候,它被推测成CompassPoint类型,当我们想再次改变directionToHead的值时候可以直接:
directionToHead = .east
switch directionToHead {
case .north:
print("Lots of planets have a north")
case .south:
print("Watch out for penguins")
case .east:
print("Where the sun rises")
case .west:
print("Where the skies are blue")
}
如果省略其中一个 case 将会出错
当然还有一种方法是,我们可以添加 default 字段,通过这种方式我们可以省略 case
let somePlanet = Planet.earth
switch somePlanet {
case .earth:
print("Mostly harmless")
default:
print("Not a safe place for humans")
}
三.枚举的关联值
每个枚举项都可以带一个关联值。
enum Barcode {
case upc(Int, Int, Int, Int)
case qrCode(String)
}
varproductBarcode = Barcode.upc(8,85909,51226,3)
productBarcode = .qrCode("ABCDEFGHIJKLMNOP")
带关联值的 switch 语句
switch productBarcode {
case .upc(let numberSystem,let manufacturer,let product, let check):
print("UPC: \(numberSystem),\(manufacturer),\(product),\(check).")
case .qrCode(let productCode):
print("QR code: \(productCode).")
}
如果关联值的类型(let、var)都相同我们可以只在最前面写个类型
switch productBarcode {
caselet.upc( numberSystem,manufacturer,product, check):
print("UPC: \(numberSystem),\(manufacturer),\(product),\(check).")
case let.qrCode(productCode):
print("QR code: \(productCode).")
}
四.行值
枚举可以设置默认值的,但是这些默认值的类型必须相同,这是和关联值的不同地方。因此必须显示的定义枚举的类型
enum ASCIIControlCharacter:Character {
case tab ="1"
case lineFeed ="2"
case carriageReturn ="3"
}
设置了行值就不能设置关联值。
当你的枚举类型是数字和字符串的时候,我们可以不显示定义每个 case 的值
如果存储的是数字的话,第一个 case 如果没有赋值的话默认为0,其他的 case 为前面的 case 值加1
enum Planet: Int {
case mercury =1, venus, earth, mars, jupiter, saturn, uranus, neptune
}
如果存储的是字符串的话,case 的行值,默认为 case 的名字。
enum CompassPoint:String {
case north, south, east, west
}
如果一个枚举是一个行值类型,那么它会自动的接受一个初始化器,通过这个初始化器,我们可以通过 case 所在的行数,来获取 case 的值。这个初始化器接受一个 Int 值,这个 Int 值有可能超过 case 的行数,因此初始化器返回一个可选值。
let positionToFind =11
if let somePlanet = Planet(rawValue:positionToFind) {
switch somePlanet {
case .earth:
print("Mostly harmless")
default:
print("Not a safe place for humans")
}
} else {
print("There isn't a planet at position\(positionToFind)")
}
// Prints "There isn't a planet at position 11"
五.递归枚举
一个递归枚举是由另一个枚举作为 case 的关联值。你可以在 case 前面加上 indirect,来告诉编译器为递归插入必要的层。
enum ArithmeticExpression {
case number(Int)
indirectcase addition(ArithmeticExpression, ArithmeticExpression)
indirectcase multiplication(ArithmeticExpression, ArithmeticExpression)
}
我们也可以在enum 关键词前加上indirect,来表明全被 case 支持递归。
indirect enum ArithmeticExpression {
case number(Int)
case addition(ArithmeticExpression, ArithmeticExpression)
case multiplication(ArithmeticExpression, ArithmeticExpression)
}