Swift3.1_枚举

枚举

定义和使用

使用enum关键词来创建枚举并且把它们的整个定义放在一对大括号内,使用case关键字来定义一个新的枚举成员值。

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

使用

let direction: CompassPoint = .north

使用Switch语句匹配枚举值

case .north:
    print("direction is north")
case .south:
    print("direction is south")
case .east:
    print("direction is east")
case .west:
    print("direction is west")
}

关联值

你可以定义Swift枚举来存储任意类型的关联值,如果需要的话,每个枚举成员的关联值类型可以各不相同。枚举的这种特性跟其他语言中的可识别联合discriminated unions,标签联合tagged unions,或者变体variants相似。

定义一个名为Barcode的枚举类型,它的一个成员值是具有(Int,Int,Int,Int)类型关联值的upc,另一个成员值是具有String类型关联值的qrCode

enum Barcode {
    case upc(Int, Int, Int, Int)
    case qrCode(String)
}

然后可以使用任意一种条形码类型创建新的条形码,例如:

var productBarcode = Barcode.upc(8, 0085, 2106, 3)

同一个商品可以被分配一个不同类型的条形码,例如:

productBarcode = Barcode.qrCode("ABCDEFGHIJKLMNOP")

原始值

枚举成员可以被默认值(称为原始值)预填充,这些原始值的类型必须相同。

enum ASCIIControlCharacter: Character {
    case tab = "\t"
    case lineFeed = "\n"
    case carriageReturn = "\r"
}
原始值的隐式赋值

在使用原始值为整数或者字符串类型的枚举时,不需要显式地为每一个枚举成员设置原始值,Swift将会自动为你赋值。

enum Planet: Int {
    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}

Plant.mercury的显式原始值为1Planet.venus的隐式原始值为2,依次类推。

使用原始值初始化枚举实例

如果在定义枚举类型的时候使用了原始值,那么将会自动获得一个初始化方法,这个方法接收一个叫做rawValue的参数,参数类型即为原始值类型,返回值则是枚举成员或nil。你可以使用这个初始化方法来创建一个新的枚举实例。

let possiblePlanet = Planet(rawValue: 7)
// possiblePlanet 类型为 Planet? 值为 Planet.uranus

let impossiblePlanet = Planet(rawValue: 11)
print(impossiblePlanet as Any)  // nil

递归枚举

递归枚举是一种枚举类型,它有一个或多个枚举成员使用该枚举类型的实例作为关联值。使用递归枚举时,编译器会插入一个间接层。你可以在枚举成员前加上indirect来表示该成员可递归。

例如,下面的例子中,枚举类型存储了简单的算术表达式:

enum ArithmeticExpression {
    case number(Int)
    indirect case addition(ArithmeticExpression, ArithmeticExpression)
    indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}

你也可以在枚举类型开头加上indirect关键字来表明它的所有成员都是可递归的:

indirect enum ArithmeticExpression {
    case number(Int)
    case addition(ArithmeticExpression, ArithmeticExpression)
    case multiplication(ArithmeticExpression, ArithmeticExpression)
}

上面定义的枚举类型可以存储三种算术表达式:纯数字、两个表达式相加、两个表达式相乘。

let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))

要操作具有递归性质的数据结构,使用递归函数是一种直截了当的方式。例如,下面是一个对算术表达式求值的函数:

func evaluate(_ expression: ArithmeticExpression) -> Int {
    switch expression {
    case let .number(value):
        return value
    case let .addition(left, right):
        return evaluate(left) + evaluate(right)
    case let .multiplication(left, right):
        return evaluate(left) * evaluate(right)
    }
}
print(evaluate(product))
// 打印 "18"

该函数如果遇到纯数字,就直接返回该数字的值。如果遇到的是加法或乘法运算,则分别计算左边表达式和右边表达式的值,然后相加或相乘。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本章将会介绍 闭包表达式尾随闭包值捕获闭包是引用类型逃逸闭包自动闭包枚举语法使用Switch语句匹配枚举值关联值原...
    寒桥阅读 1,639评论 0 3
  • 枚举为一组相关的值定义了一个共同的类型,使得可以在代码中以类型安全的方式来使用这些值。 如果熟悉 C 语言,会知道...
    穷人家的孩纸阅读 917评论 1 4
  • 枚举为一组相关的值定义了一个共同的类型,使你可以在你的代码中以类型安全的方式来使用这些值。 如果你熟悉 C 语言,...
    雨影阅读 449评论 0 0
  • 天冷了,又下起了小雨,这个世界显得更冷了。 不知道你那边的天气怎么样,是不是也是这么冷?是不是也在下着雨? 此刻,...
    向着太阳奔跑的石头阅读 578评论 0 0
  • 世界观:关于世界的根本看法;人生观:关于人生的看法;价值观:回答在人生当中什么事认为值得或不值得的,以及它的价值大小。
    目标感阅读 138评论 0 0

友情链接更多精彩内容