版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 4.0
Syntax
使用 enum
关键字引出 enumeration 的定义:
1 | enum SomeEnumeration { |
下面是一个 compass 的例子,使用 case
来引出 enumeration 的各项:
1 | enum CompassPoint { |
跟C或C++不同的是,上面例子中的
North
,South
,East
,Weat
并不会隐式地声明为 0, 1, 2, 3,需要CompassPoint
显示的定义。
当有多个时,如下:
1 | enum Planet { |
使用enum定义后都是一种类型。planet
被一个 Planet
初始化之后,它就可以被赋以该类型的其他值而不需要重新标明该类型。
matching enumeration with a switch statement
1 | var direction = CompassPoint.South |
switch 必须是详尽彻底的,即 case
必须包含所有的情况,不然应该加上 default
分支:
1 | switch direction { |
associated values
可以给枚举来存放任何类型的值,例如条形码的例子:
1 | enum Barcode { |
UPCA
存放的是包含四个 Int 型的元组,QRCode
则为 String。可以给它们赋值:
1 | var productBarcode = Barcode.UPCA(8, 8590, 51226, 3) |
还可以将枚举中的相关值取出来作为一个 constant (let) 或 variable (var):
1 | switch productBarcode { |
当取出的值均为同一类型时,可以将 let 或 var 提出来,下面代码与上面等价:
1 | switch productBarcode { |
raw values
一个叫 ASCIIControlCharacter
的枚举存放的是 Character 类型:
1 | enum ASCIIControlCharacter: Character { |
raw value 可以是 string,character,int,float,每个 raw value 必须唯一。
raw value 与 associated value 不同,raw value 是预设的值。
Implicitly Assigned raw value
隐式指定的 raw value 是指当指定了 raw type 时,每个值会比前一个大1,如果第一个未指定时,则赋为 0 ,依次增加。还是前面的 Planet
例子:
1 | enum Planet: Int { |
如果 raw type 为 String 时,隐式值为 case name:
1 | enum CompassPoint: String { |
initializing from a raw value
1 | let possiblePlanet = Planet(rawValue: 7) |
因为初始化时,可能会超过界限,这就是为什么 possiblePlanet
为 Planet?
类型。
1 | let positionToFind = 9 |
recursive enumrarions
像算术表达式一样可以嵌套 (5 + 4) * 2 ,要枚举支持嵌套(递归),需要用 indirect
关键字标明:
1 | enum ArithmeticExpression { |
也可以把 indirect
放在外面,使所有 case 都支持 recursive:
1 | indirect enum ArithmeticExpression { |
这个枚举类型包含三个算术表达式:一个数字,两个数相加,两个数相乘。用法:
1 | func evaluate(expression: ArithmeticExpression) -> Int { |
这个函数将数字进行简单的返回,而“加法”和“乘法”则 evaluate left
和 right
,然后相加或相乘。