1、枚举的定义
枚举定义了一个通用类型的一组相关的值,使你可以在你的代码中以一个安全的方式来使用这些值。
每个枚举定义了一个全新的类型。像 Swift 中其他类型一样,它们的名字(例如 CompassPoint 和 Planet)必须以一个大写字母开头。给枚举类型起一个单数名字而不是复数名字,以便于读起来更加容易理解。
2、枚举的语法
使用
enum 关键词并且把它们的整个定义放在一对大括号内。
enum SomeEumeration {
// enumeration definition goes here
}
例如:一个枚举中被定义的值(例如 North,South,East 和 West)是枚举的成员值。 case 关键词表明新的一行成员值将被定义。
enum CompassPoint {
case North
case South
case East
case West
}
3、定义多个成员值
多个成员值可以出现在同一行上,用逗号隔开。
enum Planet {
case Mercury, Venus, Earth, Mars, Jupiter
}
4、使用枚举
var directionToHead = CompassPoint.West
directionToHead 的类型被推断当它被 CompassPoint 的一个可能值初始化。一旦 directionToHead 被声明为一个 CompassPoint,你可以使用更短的点(.)语法将其设置为另一个 CompassPoint 的值。
directionToHead = .East
directionToHead 的类型已知时,当设定它的值时,你可以不再写类型名。
5、switch 和 匹配枚举值
var str1:String
switch directionToHead {
case .North:
str1 = "Lots of planets have a north"
case .South:
str1 = "Watch out for penguins"
case .East:
str1 = "Where the sun rises"
case .West:
str1 = "Where the skies are blue"
}
正如在控制流中介绍,
当考虑一个枚举的成员们时,一个 switch 语句必须全面。如果忽略了.West 这种情况,上面那段代码将无法通过编译,因为它没有考虑到 CompassPoint 的全部成员。
全面性的要求确保了枚举成员不会被意外遗漏。
当不需要匹配每个枚举成员的时候,你可以提供一个默认 default 分支来涵盖所有未明确被提出的任何成员。
6、关联值(Associated Values)
假设一个库存跟踪系统需要利用两种不同类型的条形码来跟踪商品。有些商品上标有 UPC-A 格式的一维码,它使用数字 0 到 9。其他商品上标有 QR 码格式的二维码,它可以使用任何 ISO8859-1 字符。
enum Barcode {
case UPCA(Int, Int, Int)
case QRCode(String)
}
以上可以理解为定义一个名为 Barcode 的枚举类型,它可以是 UPCA 的一个关联值(Int,Int,Int),或者QRCode 的一个字符串类型(String)关联值。
然后可以使用任何一种条码类型创建新的条码,如:
var productBarcode = Barcode.UPCA(8, 85909_51226, 3)
同一个商品还可以被分配一个不同类型的条形码:
productBarcode = .QRCode("ABCDEFGHIJKLMNOP")
可以使用一个 switch 语句来检查,关联值可以被提取作为 switch 语句的一部分。你可以在 switch 的 case 分支代码中使用一个常量(用 let 前缀)或者作为一个变量(用 var 前缀)来提取关联值。
var
str2:
String
switch
productBarcode
{
case
.UPCA(
let
numberSystem,
let
identifier,
let
check):
str2
=
"UPC-A with value of
\(numberSystem)
,
\(identifier)
,
\(check)
."
case
.QRCode(
let
productCode):
str2
=
"QR code with value of
\(productCode)
."
}
如果一个枚举成员的所有关联值被提取为常量,或者它们全部被
- 上一篇Swift函数和闭包
- 下一篇简单的解决 百度data API数据统计:gzdecode(): insufficient memory