美文网首页
Swift3.1_枚举

Swift3.1_枚举

作者: Carson_Zhu | 来源:发表于2018-02-21 22:21 被阅读0次

枚举

定义和使用

使用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"

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

相关文章

  • Swift3.1_枚举

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

  • Swift3.1_基础

    常量和变量 常量和变量必须在使用前声明,用let来声明常量,用var来声明变量。 常量声明必须含有初始值,且不可修...

  • Swift3.1_协议

    简介 规定了用来实现某一特定任务或者功能的方法、属性,以及其他需要的东西。类、结构体或枚举都可以遵循协议,并为协议...

  • Swift3.1_扩展

    扩展 就是为一个已有的类、结构体、枚举类型或者协议类型添加新功能,但是不能重写已有的功能。 Swift中的扩展可以...

  • Swift3.1_继承

    简介 一个类可以继承另一个类的方法,属性和其它特性。当一个类继承其它类时,继承类叫子类,被继承类叫超类(或父类)。...

  • C#枚举及与枚举常数的转换

    1、枚举的定义 2、枚举绑定到comboBox 3、枚举常数转换为枚举string转枚举 数字值转枚举

  • Swift 基础笔记 - 枚举

    枚举 OC定义和使用枚举 Swift定义枚举类型 Swift判断枚举类型 枚举成员类型

  • 枚举类

    1.枚举类型的定义: 枚举类型定义的一般形式为 enum 枚举名{//枚举值表枚举值1;枚举值2;...} 在枚举...

  • 10、枚举与闭包

    枚举 枚举和普通类相比有什么优势 枚举类型、枚举名称与枚举值 枚举的比较运算 两个枚举之间可以使用等值比较(==)...

  • Swift与OC的语法简单对比(常用语法二)

    20- 枚举,枚举原始值,枚举相关值,switch提取枚举关联值 Swift枚举: Swift中的枚举比OC中的枚...

网友评论

      本文标题:Swift3.1_枚举

      本文链接:https://www.haomeiwen.com/subject/iwpotftx.html