枚举为一组相关的值定义了一个共同的类型,使你可以在你的代码中以类型安全的方式来使用这些值。
如果你熟悉 C 语言,你会知道在 C 语言中,枚举会为一组整型值分配相关联的名称。Swift 中的枚举更加灵活,不必给每一个枚举成员提供一个值。如果给枚举成员提供一个值(称为原始值),则该值的类型可以是字符串、字符,或是一个整型值或浮点数。
此外,枚举成员可以指定任意类型的关联值存储到枚举成员中,就像其他语言中的联合体(unions)和变体(variants)。你可以在一个枚举中定义一组相关的枚举成员,每一个枚举成员都可以有适当类型的关联值。
在 Swift 中,枚举类型是一等(first-class)类型。它们采用了很多在传统上只被类(class)所支持的特性,例如计算属性(computed properties),用于提供枚举值的附加信息,实例方法(instance methods),用于提供和枚举值相关联的功能。枚举也可以定义构造函数(initializers)来提供一个初始值;可以在原始实现的基础上扩展它们的功能;还可以遵循协议(protocols)来提供标准的功能。
想了解更多相关信息,请参见 属性,方法,构造过程,扩展 和 协议。
枚举语法
使用enum
关键词来创建枚举并且把它们的整个定义放在一对大括号内:
enum SomeEnumeration { // 枚举定义放在这里 }
下面是用枚举表示指南针四个方向的例子:
enum CompassPoint { case north case south case east case west }
枚举中定义的值(如north
,south
,east
和west
)是这个枚举的成员值(或成员)。你可以使用 case 关键字来定义一个新的枚举成员值。
注意
与 C 和 Objective-C 不同,Swift 的枚举成员在被创建时不会被赋予一个默认的整型值。在上面的 CompassPoint 例子中,north,south,east 和 west 不会被隐式地赋值为 0,1,2 和 3。相反,这些枚举成员本身就是完备的值,这些值的类型是已经明确定义好的 CompassPoint 类型。
多个成员值可以出现在同一行上,用逗号隔开:
enum Planet { case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune }
每个枚举定义了一个全新的类型。像 Swift 中其他类型一样,它们的名字(例如 CompassPoint 和 Planet)以一个大写字母开头。给枚举类型起一个单数名字而不是复数名字,以便于:
var directionToHead = CompassPoint.west
directionToHead
的类型可以在它被CompassPoint
的某个值初始化时推断出来。一旦directionToHead
被声明为CompassPoint
类型,你可以使用更简短的点语法将其设置为另一个CompassPoint
的值:
directionToHead = .east
当directionToHead
的类型已知时,再次为其赋值可以省略枚举类型名。在使用具有显式类型的枚举值时,这种写法让代码具有更好的可读性。
使用 Switch 语句匹配枚举值
你可以使用 switch
语句匹配单个枚举值:
directionToHead = .south 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") } // 打印“Watch out for penguins”
你可以这样理解这段代码:
“判断 directionToHead
的值。当它等于 .north
,打印 “Lots of planets have a north”
。当它等于 .south
,打印 “Watch out for penguins”
。”
……以此类推。
正如在 控制流 中介绍的那样,在判断一个枚举类型的值时,switch
语句必须穷举所有情况。如果忽略了 .west
这种情况,上面那段代码将无法通过编译,因为它没有考虑到 CompassPoint
的全部成员。强制穷举确保了枚举成员不会被意外遗漏。
当不需要匹配每个枚举成员的时候,你可以提供一个 default
分支来涵盖所有未明确处理的枚举成员:
let somePlanet = Planet.earth switch somePlanet { case .earth: print("Mostly harmless") default: print("Not a safe place for humans") } // 打印“Mostly harmless”