avatar
童琦杰
Feb 18, 2017Technology

Swift - 枚举

枚举定义

使用关键字enum以及关键字case定义枚举类型。

swift
enum CompassPoint {
    case North
    case South
    case East
    case West
}

也可以将多个枚举条件写在一行内,使用逗号,分隔。

swift
enum CompassPoint {
    case North, South, East, West
}

若一个枚举实例的类型已知,则可以使用缩写形式给该实例赋值。当然,从可读性上不建议这样写。

swift
var directionToHead = CompassPoint.West
directionToHead = .East

枚举关联值

Swift允许你对枚举条件设置常量或变量关联值,这个值可以是任何类型的值。这样,你可以给每个枚举条件添加自定义信息。

swift
enum Barcode {
    case UPCA(Int, Int, Int, Int)
    case QRCode(String)
}
var productBarcode = Barcode.UPCA(8, 85909, 51226, 3)
productBarcode = .QRCode("ABCDEFGHIJKLMNOP")

对于设置了关联值的枚举类型,当使用switch语句时可以提取其关联值,并且可以指定该关联值为常量(使用关键字let)或变量(使用关键字var)。

swift
switch productBarcode {
    case .UPCA(let numberSystem, let manufacturer, let product, let check):
        print("UPC-A: \(numberSystem), \(manufacturer), \(product), \(check).")
    case .QRCode(let productCode):
        print("QR code: \(productCode).")
}

若提取的关联值都作为常量或都作为变量,则可以在关键字case后添加关键字let或关键字var

swift
switch productBarcode {
    case let .UPCA(numberSystem, manufacturer, product, check):
        print("UPC-A: \(numberSystem), \(manufacturer), \(product), \(check).")
    case let .QRCode(productCode):
        print("QR code: \(productCode).")
}

枚举默认值

枚举关联值的另一种形式就是枚举默认值,默认值可以是字符串、字符、整数、浮点数。但是,需要保证每个默认值是唯一的。

swift
enum ASCIIControlCharacter: Character {
    case Tab = "\t"
    case LineFeed = "\n"
    case CarriageReturn = "\r"
}

与枚举关联值不同的是,枚举默认值在你定义枚举类型时设置,并且每个枚举条件的默认值不会改变,而枚举关联值在创建枚举实例时设置,并且相同枚举条件对应的关联值可以不同。

Swift支持隐式地设置整数类型默认值或字符串类型默认值,对于整数类型默认值,若第一个枚举条件未设置默认值,则Swift自动设置其默认值为0,之后的枚举条件默认值依次递增。对于字符串类型默认值,每个枚举条件的默认值为该条件的名字。

swift
enum Planet: Int {
    case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}
// Planet.Venus的默认值为2

enum CompassPoint: String {
    case North, South, East, West
}
// CompassPoint.South的默认值为"South"

你可以通过枚举实例的属性rawValue访问其默认值。

swift
let earthsOrder = Planet.Earth.rawValue

如果你定义了一个带默认值的枚举类型,那么该枚举类型自动实现一个带参数rawValue的初始化方法,该初始化方法返回枚举实例或nil值。

swift
let possiblePlanet = Planet(rawValue: 7)

递归枚举

递归枚举是指一个关联值包含这个枚举实例的枚举,使用关键字indirect声明递归枚举。

swift
enum ArithmeticExpression {
    case Number(Int)
    indirect case Addition(ArithmeticExpression, ArithmeticExpression)
    indirect case Multiplication(ArithmeticExpression, ArithmeticExpression)
}

indirect enum ArithmeticExpression {
    case Number(Int)
    case Addition(ArithmeticExpression, ArithmeticExpression)
    case Multiplication(ArithmeticExpression, ArithmeticExpression)
}
© 2015-2022 tongqijie.com 版权所有沪ICP备17000682号