swift中一些关于枚举的基础知识点

1. 简介

每个枚举都定义了一个全新的类型。枚举使用了很多被类支持的特性,例如计算属性实例方法初始化器遵循协议

枚举类型类似于Int,Double。所以在定义一个变量/常量时它的类型是枚举类型,而它的值又是枚举类型中的一个值。

2. 基本用法

如果变量/常量以枚举类型被声明,你可以用点语法把它设定成不同的值
示例:

enum CompassPoint {
    case north
    case south
    case east
    case west
}

var directionToHead = CompassPoint.west
directionToHead = .east

directionToHead的类型是已知的,所以当设定它的值时你可以不用写类型。

3. 关联值

在枚举中,将其它类型的值与成员值一起存储是很有用的。这样你就可以将额外的信息和成员值一起储存。这种值称为关联值
定义示例:

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).")
}

4. 原始值

作为相关值的另一种选择,枚举成员可以拥有相同类型的默认值,我们将其称为原始值
注意:原始值与关联值不同。原始值是在第一次定义枚举时,用来预先填充的值,特定枚举成员的原始值始终相同。关联值基于枚举成员之一创建新的变量/常量时设定,并且每次这么做的时候关联值可以不同
示例:

enum ASCIIControlCharacter: Character {
    case tab = "\t"
    case lineFeed = "\n"
    case carriageReturn = "\r"
}
//类型 Character是一种特殊的类

5. 隐式指定原始值

在操作整数或字符串原始值枚举的时候,你不必显式地给每一个成员都分配一个原始值。当你没有分配时,Swift 将会自动为你分配值。

  • 整数值被用于作为原始值时,每一个成员的隐式值都比前一个大1。如果第一个成员没有值,那么它的值是 0 。
    示例:
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" ,以此类推。
  • 你可以用 rawValue属性来访问一个枚举成员的原始值:
let earthsOrder = Planet.Earth.rawValue
// earthsOrder is 3
 
let sunsetDirection = CompassPoint.west.rawValue
// sunsetDirection is "west"

6. 从原始值初始化

如果你用原始值类型来定义一个枚举,那么枚举就会自动收到一个可以接受原始值类型的值的初始化器(叫做 rawValue的形式参数),然后返回一个枚举成员或者nil 。你可以使用这个初始化器来尝试创建一个枚举的新实例。

let possiblePlanet = Planet(rawValue: 7)
// possiblePlanet is of type Planet? and equals Planet.Uranus

不是所有可能的 Int值都会对应一个行星,因此原始值的初始化器总是返回可选的枚举成员,即 Planet?

你可能感兴趣的:(编程日记)