Swift枚举(Enumerations)
最后更新于:2022-04-01 14:34:09
枚举是一组相关的值的集合,并允许你在代码中使用。
枚举允许所有的值是相同类型的,也可以是不同类型的,还可以为这些值设置默认值。
## 枚举语法
枚举使用enum做为关键字,后跟枚举名,其内部值在一个{}内。
空枚举:
~~~
enum SomeEnumeration {
// enumeration definition goes here
}
~~~
下面这个枚举包含四个值:
~~~
// 枚举基本类型
enum CompassPoint {
case North
case South
case East
case West
}
~~~
如果你觉得case的行数太多,枚举还支持简写,将其写在一行。
~~~
enum Planet {
case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}
~~~
枚举是一个崭新的类型,你可以通过let或var去获得它们。
~~~
// 使用
var directionToHead = CompassPoint.West
~~~
如果你觉得写枚举名太麻烦,枚举还支持不写枚举名,直接使用点语法。
~~~
directionToHead = .East
~~~
## 枚举匹配
你可以使用switch或if做枚举匹配。
~~~
var directionToHead = CompassPoint.South
// if匹配
if directionToHead == CompassPoint.South {
directionToHead = .East
}
// switch匹配
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")
default:
print("default")
}
~~~
## 关联值
枚举支持关联值,在case后可以使用一个结构体。
~~~
enum Barcode {
case UPCA(Int, Int, Int, Int)
case QRCode(String)
}
~~~
初始化
~~~
var productBarcode = Barcode.UPCA(8, 85909, 51226, 3)
productBarcode = .QRCode("ABCDEFGHIJKLMNOP")
~~~
使用switch做匹配,这里用到了let
~~~
switch productBarcode {
case .UPCA(let numberSystem, let manufacturer, let product, let check):
print("UPC-A: \(numberSystem), \(manufacturer), \(product), \(check).")
case .QRCode(let productCode):
print("QR code: \(productCode).")
}
~~~
如果你觉得let太麻烦了,枚举的关联值匹配也支持不写let。
~~~
switch productBarcode {
case let .UPCA(numberSystem, manufacturer, product, check):
print("UPC-A: \(numberSystem), \(manufacturer), \(product), \(check).")
case let .QRCode(productCode):
print("QR code: \(productCode).")
}
~~~
## 原始值
枚举支持为每个属性设置原始值,下面设置Character类型的原始值。
~~~
enum ASCIIControlCharacter: Character {
case Tab = "\t"
case LineFeed = "\n"
case CarriageReturn = "\r"
}
~~~
### 隐式分配原始值
在枚举中,还支持隐式分配枚举值。
~~~
enum Planet: Int {
case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}
~~~
在上面的例子中,整个枚举Planet为Int类型,并设置了Mercury=1。swift会自动为接下来的属性赋值Venus=2、Earth=3。。。
还有一种情况,你不给任何属性赋初始值,只是指定了枚举的类型。Swift也可以自动判断内部属性的原始值。
~~~
enum CompassPoint: String {
case North, South, East, West
}
~~~
如上所示,枚举会使North=”North”、South=“South”、East = “East”和West=“West”。
关于有原始值的枚举使用如下:
~~~
print("\(Planet.Earth.rawValue)") // 3
print("\(CompassPoint.West.rawValue)") // "West"
~~~
### 通过原始值初始化
如同初始化类,你也可以通过原始值获取枚举。
~~~
let possiblePlanet = Planet(rawValue: 7)
~~~
但是通过原始值获取枚举时,有的时候获取不到,会返回nil。
~~~
let positionToFind = 9
// 当原始值不匹配时,返回为nil
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)")
}
~~~
## 循环枚举
在枚举中可以设置任何原始值,同样可以设置枚举,并且是当前枚举,需要用到的关键字是indirect。
~~~
enum ArithmeticExpression {
case Number(Int)
indirect case Addition(ArithmeticExpression, ArithmeticExpression)
indirect case Multiplication(ArithmeticExpression, ArithmeticExpression)
}
~~~
如果你觉得每个case都写indirect太麻烦,枚举还支持你将indirect写到enum前。
~~~
indirect enum ArithmeticExpression {
case Number(Int)
case Addition(ArithmeticExpression, ArithmeticExpression)
case Multiplication(ArithmeticExpression, ArithmeticExpression)
}
~~~
下面介绍了怎么运用上面的循环枚举计算(5 + 4) * 2
~~~
// 函数使用
func evaluate(expression: ArithmeticExpression) -> Int {
switch expression {
case .Number(let value):
return value
case .Addition(let left, let right):
return evaluate(left) + evaluate(right)
case .Multiplication(let left, let right):
return evaluate(left) * evaluate(right)
}
}
// evaluate (5 + 4) * 2
let five = ArithmeticExpression.Number(5)
let four = ArithmeticExpression.Number(4)
let sum = ArithmeticExpression.Addition(five, four)
let product = ArithmeticExpression.Multiplication(sum, ArithmeticExpression.Number(2))
print(evaluate(product))
~~~
## 其他
### 参考资料
[The Swift Programming Language (Swift 2.1)](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html)
### 文档修改记录
| 时间 | 描述 |
|-----|-----|
| 2015-10-28 | 根据 [The Swift Programming Language (Swift 2.1)](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html)中的Enumerations总结 |
版权所有:[http://blog.csdn.net/y550918116j](http://blog.csdn.net/y550918116j)