本期我们将介绍 Swift 中的枚举。枚举为一组相关的值定义了一个共同的类型,使你可以在你的代码中以类型安全的方式来使用这些值。

01 什么是枚举

java swich 与 枚举 枚举类 switch_算术表达式

如果给枚举成员提供一个原始值,则该值的类型可以是字符串、字符,或是一个整型值或浮点数。

在 Swift 中,枚举采用了很多在传统上只被类所支持的特性,例如计算属性,用于提供枚举值的附加信息。如果给枚举成员提供一个原始值,则该值的类型可以是字符串、字符,或是一个整型值或浮点数。而实例方法用于提供和枚举值相关联的功能。枚举也可以定义构造函数来提供一个初始值,在原始实现的基础上扩展它们的功能。

java swich 与 枚举 枚举类 switch_算术表达式

java swich 与 枚举 枚举类 switch_算术表达式

02 枚举的语法

java swich 与 枚举 枚举类 switch_算术表达式

使用 enum 关键词来创建枚举并且把它们的整个定义放在一对大括号内,下面是用枚举表示指南针四个方向的例子:

java swich 与 枚举 枚举类 switch_switch 枚举_05

枚举中定义的值(如 north,south,east 和 west)是这个枚举的成员值(或成员)。你可以使用 case 关键字来定义一个新的枚举成员值。

多个成员值可以出现在同一行上,用逗号隔开:

java swich 与 枚举 枚举类 switch_switch 枚举_06

每个枚举定义了一个全新的类型。像 Swift 中其他类型一样,它们的名字以一个大写字母开头。给枚举类型起一个单数名字而不是复数名字,以便于:

java swich 与 枚举 枚举类 switch_java swich 与 枚举_07

java swich 与 枚举 枚举类 switch_算术表达式

java swich 与 枚举 枚举类 switch_算术表达式

03 匹配枚举值

java swich 与 枚举 枚举类 switch_算术表达式

我们可以使用 switch 语句匹配单个枚举值:

java swich 与 枚举 枚举类 switch_枚举类型_11

可以这样理解这段代码:

判断 directionToHead 的值。当它等于.north,打印“NORTH”.当它等于.south,打印“SOUTH”。以此类推。

在判断一个枚举类型的值时,switch 语句必须穷举所有情况。如果忽略了.west 这种情况,上面那段代码将无法通过编译,因为它没有考虑到 CompassPoint 的全部成员。强制穷举确保了枚举成员不会被意外遗漏。

当不需要匹配每个枚举成员的时候,你可以提供一个 default 分支来涵盖所有未明确处理的枚举成员:

java swich 与 枚举 枚举类 switch_switch 枚举_12

java swich 与 枚举 枚举类 switch_算术表达式

java swich 与 枚举 枚举类 switch_算术表达式

04 枚举成员的遍历

java swich 与 枚举 枚举类 switch_算术表达式

在一些情况下会需要得到一个包含枚举所有成员的集合。可以通过如下代码实现:

java swich 与 枚举 枚举类 switch_枚举类型_16

在前面的例子中,打印结果为“3 drinks avaiable”。通过 Drink.allCases 可以访问到包含 Drink 枚举所有成员的集合。allCases 的使用方法和其它一般集合一样——集合中的元素是枚举类型的实例,所以在上面的情况中,这些元素是 Drink 的值。在前面的例子中,统计了总共有多少个枚举成员。

而在下面的例子中,则使用 for 循环来遍历所有枚举成员:

java swich 与 枚举 枚举类 switch_算术表达式_17

打印结果为:

coffee 

tea 

juice

java swich 与 枚举 枚举类 switch_算术表达式

java swich 与 枚举 枚举类 switch_算术表达式

05 递归枚举

java swich 与 枚举 枚举类 switch_算术表达式

递归枚举是一种枚举类型,它有一个或多个枚举成员使用该枚举类型的实例作为关联值。使用递归枚举时,编译器会插入一个间接层。你可以在枚举成员前加上 indirect 来表示该成员可递归。

例如,下面的例子中,枚举类型存储了简单的算术表达式,在枚举类型开头加上 indirect 关键字来表明它的所有成员都是可递归的:

java swich 与 枚举 枚举类 switch_递归_21

上面定义的枚举类型可以存储三种算术表达式:纯数字、两个表达式相加、两个表达式相乘。枚举成员 addition 和 multiplication 的关联值也是算术表达式——这些关联值使得嵌套表达式成为可能。例如,表达式 (5+4)*2,乘号右边是一个数字,左边则是另一个表达式。因为数据是嵌套的,因而用来存储数据的枚举类型也需要支持这种嵌套——这意味着枚举类型需要支持递归。下面的代码展示了使用 Math 这个递归枚举创建表达式 (5+4)*2:

java swich 与 枚举 枚举类 switch_枚举类型_22

java swich 与 枚举 枚举类 switch_算术表达式

java swich 与 枚举 枚举类 switch_算术表达式

那么 Swift 中枚举的知识就介绍到这里啦,我们下期再见~