1.枚举语法
1.用enum关键字来定义一个枚举,然后将其所有的定义内容放在一个大括号({})中; 2.多个成员值可以出现在同一行中,要用逗号隔开.
enum CompassPoint {
case north
case south
case east
case west
}
2.使用Switch语句来匹配枚举值
你可以使用Switch语句来匹配每一个单独的枚举值.
let directionToHead = CompassPoint.south
switch directionToHead
{
case .north:
print("11111")
case .south:
print("2222")
case .east:
print("33333")
case .west:
print("4444")
}
enum CompassPoint {
case north
case south
case east
case west
}
3.遍历枚举的case
对于某些枚举来说,如果能够有一个集合包含了枚举的所有情况就好了.你可以通过在枚举名字后面写:CaseIterable来允许枚举被遍历.Swift会暴露一个包含对应枚举类型所有情况的集合名为allCases
let number = points.allCases.count
for direction in points.allCases {
print(direction)
}
enum points :CaseIterable{
case north
case south
case east
case west
}
4.关联值
var product = Barcode.upc(8, 85909, 51226, 3)
print(product)
product = .qrCode("qwertyuiop")
print(product)
enum Barcode {
case upc(Int,Int,Int,Int)
case qrCode(String)
}
5.原始值
枚举成员可以用相同类型的默认最预先填充(成为原始值).
enum ASCIIControlChatacter: Character {
case tab = "\t"
case lineFeed = "\n"
case carriageReturn = "\r"
}
6.预设原始值
当你在操作存储值整数或字符串原始值枚举的时候,你不必显示的给每一个成员都分配一个原始值.当你没有分配时,Swift将会自动为你分配值.
enum CompassPoint: Int{
case north = 1,south,east,west
}
7.从原始值初始化
如果你用原始值类型来定义一个枚举,那么枚举就会自动收到一个可以接受原始值类型的值得初始化器(叫做rawValue的形式参数)然后返回一个枚举成员或者nil.你可以使用这个初始化器来尝试创建一个枚举的新实例.
let directionToHead = CompassPoint(rawValue: 3)
8.递归枚举
递归枚举是拥有另一个枚举作为枚举成员关联值的枚举.当编译器作递归枚举时必须插入间接寻址层.你可以在声明枚举成员之前使用indirect关键字来明确他是递归的.
let five = ArithmetcExpression.number(5)
let four = ArithmetcExpression.number(4)
let sum = ArithmetcExpression.addition(five, four)
let product = ArithmetcExpression.multiplication(sum, ArithmetcExpression.number(2))
print(evaluate(product))
indirect enum ArithmetcExpression {
case number(Int)
case addition(ArithmetcExpression,ArithmetcExpression)
case multiplication(ArithmetcExpression,ArithmetcExpression)
}
func evaluate(_ expression: ArithmetcExpression) -> Int {
switch expression {
case let .number(value):
return value
case let .addition(left, right):
return evaluate(left)+evaluate(right)
case let .multiplication(left, right):
return evaluate(left)*evaluate(right)
}
}
|