每个枚举都定义了一个全新的类型。枚举使用了很多被类支持的特性,例如计算属性,实例方法,初始化器,遵循协议。
枚举类型类似于Int,Double。所以在定义一个变量/常量时它的类型是枚举类型,而它的值又是枚举类型中的一个值。
如果变量/常量以枚举类型被声明,你可以用点语法把它设定成不同的值
示例:
enum CompassPoint {
case north
case south
case east
case west
}
var directionToHead = CompassPoint.west
directionToHead = .east
directionToHead的类型是已知的,所以当设定它的值时你可以不用写类型。
在枚举中,将其它类型的值与成员值一起存储是很有用的。这样你就可以将额外的信息和成员值一起储存。这种值称为关联值。
定义示例:
enum Barcode {
case upc(Int, Int, Int, Int)
case qrCode(String)
}
var productBarcode = Barcode.upc(8, 85909, 51226, 3)
productBarcode = .qrCode("ABCDEFGHIJKLMNOP")
注1:这个定义并不提供实际的 Int或 String值——它只表示当 Barcode类型的实例是. upc或. qrCode相同时可以存储的关联值类型。
注2:枚举类型中成员关系是A或B的关系,而类和结构体中成员关系是A和B的关系。
使用示例1:
switch productBarcode {
case .upc(let numberSystem, let manufacturer, let product, let check):
print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")
case .qrCode(let productCode):
print("QR code: \(productCode).")
}
//可以提取具体的某项关联值以便使用
如果一个枚举成员的所有相关值都被提取为变量/常量,你可以用一个单独的 var或 let在成员名称前标注:
使用示例2:
switch productBarcode {
case let .upc(numberSystem, manufacturer, product, check):
print("UPC : \(numberSystem), \(manufacturer), \(product), \(check).")
case let .qrCode(productCode):
print("QR code: \(productCode).")
}
作为相关值的另一种选择,枚举成员可以拥有相同类型的默认值,我们将其称为原始值。
注意:原始值与关联值不同。原始值是在第一次定义枚举时,用来预先填充的值,特定枚举成员的原始值始终相同。关联值基于枚举成员之一创建新的变量/常量时设定,并且每次这么做的时候关联值可以不同。
示例:
enum ASCIIControlCharacter: Character {
case tab = "\t"
case lineFeed = "\n"
case carriageReturn = "\r"
}
//类型 Character是一种特殊的类
在操作整数或字符串原始值枚举的时候,你不必显式地给每一个成员都分配一个原始值。当你没有分配时,Swift 将会自动为你分配值。
enum Planet: Int {
case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}
//Planet.mercury有一个明确的原始值 1 ,Planet.venus的隐式原始值是 2,以此类推。
enum CompassPoint: String {
case north, south, east, west
}
//在上面的例子中, CompassPoint.south有一个隐式原始值 "south" ,以此类推。
let earthsOrder = Planet.Earth.rawValue
// earthsOrder is 3
let sunsetDirection = CompassPoint.west.rawValue
// sunsetDirection is "west"
如果你用原始值类型来定义一个枚举,那么枚举就会自动收到一个可以接受原始值类型的值的初始化器(叫做 rawValue的形式参数),然后返回一个枚举成员或者nil 。你可以使用这个初始化器来尝试创建一个枚举的新实例。
let possiblePlanet = Planet(rawValue: 7)
// possiblePlanet is of type Planet? and equals Planet.Uranus
不是所有可能的 Int值都会对应一个行星,因此原始值的初始化器总是返回可选的枚举成员,即 Planet?