Swift(九、枚举)

前端之家收集整理的这篇文章主要介绍了Swift(九、枚举)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1、Swift入门学习笔记(第一版),对Swift的基础知识点进行梳理总结。知识点一直在变,只是作为参考,以苹果官方文档为准~

2、在学习完基本的知识点以后会结合官方文档及相关资料,在此版本的基础上进行添加更改。


九、枚举

C语言中枚举名和一个整数值相对应。而Swift不用。不过给枚举成员提供值(“原始”值),值类型可以为字符串,字符或者一个整型值或浮点数


1、枚举语法

定义

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

另一形式:

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

a、case关键字表示一行新的成员值将被定义

b、区别于C/OC,Swift枚举成员不会被赋予默认的整数值!!!

c、这些成员本身就有完备的值,这些值是已经明确定义好的CompassPoint类型

d、每个枚举定义了一个全新的类型,CompassPoint类必须以大写字母开头


2、匹配枚举值

//访问枚举成员
var directionToHead = CompassPoint.East //系统推断directionToHead类型为CompassPoint
//再次赋值,可以用缩写语法(.)来设置,省略枚举名
directionToHead = .North
switch directionToHead {
case .East:
    print("East!")
case .South:
    print("South!")
case .West:
    print("West!")
case .North:
    print("North!")
}

Output:

North!

3、关联值(Associated Values)

相当于枚举成员的补充,存储成员值之外的自定义信息

以官方文档的例子进行解说
商品一般有两种条形码, UPC-A 格式(4个整型值)或者QR码格式(字符串)

定义Barcode的枚举类型,成员其一为具有(Int,Int,Int,Int)类型关联值的UPCA,其二为具有String类型关联值的QRCode。
可以利用Barcode.UPCABarcode.QRCode存储关联值

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

第二部操作QRCode及其关联值会替代UPCA及其关联值。

Barcode同意时间只能存储一个变量

可以利用Swift语句来检查器存储了哪一个枚举类型

switch productBarcode {
//case let .UPCA(numberSystem,manufacturer,product,check):   //不同形式
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).")
}

Output:

QR code: ABCDEFGHIJKLMNOP.

4、原始值(Raw Values)

关联值:存储不同类型关联值的枚举成员,可变化

原始值:枚举成员有默认值,但类型须相同,不可变

4.1、原始值的显示赋值

enum testStringEnum: String {
    case nameA = "A"
    case nameB = "B"
    case nameC = "C"
}
print(testStringEnum.nameA.rawValue)

Output:

A

注意点:
a、原始值可以是字符串,字符,或者任意整型值或浮点型值。
b、每个原始值在枚举声明中必须是唯一的。

4.2、原始值的隐式赋值

a、当以整数作原始值,隐式赋值的值依次递增1,第一个枚举成员要赋值,未赋值默认0。

b、当以字符串作为原始值类型,隐式原始值为该枚举成员的名称

enum CompassPoint1:Int {
    case North,West
}
print(CompassPoint1.North.rawValue)

Output:

0

4.3、利用初始值初始化枚举实例

返回值为枚举成员或者nil,下面的例子因为Int=5未找到匹配值所以打印为nil

let position = CompassPoint1(rawValue: 5)
print(position?.rawValue)

因为可为nil,因此可以推断position为CompassPoint1?类型,可选类型

注意:原始值构造器是可失败构造器,并非每个原始值都有与之对应的枚举成员(即可能为nil的意思,即前一句话的意思)


5、递归枚举

一种枚举类型,有一个或多个枚举成员使用该枚举类型的实例作为关联值。

使用递归枚举时,编译器会插入间接层。枚举成员前加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)
//}

func evaluate(expression:ArithmeticExpression) -> Int {
    switch expression {
    case .Number(let value):
        return value
    case .Addition(let left,let right):
        return evaluate(left) + evaluate(right)
    case .Multiplication(let left,let right):
        return evaluate(left) * evaluate(right)
    }
}

//计算(2+18)*18
let num1 = ArithmeticExpression.Number(2)
let num2 = ArithmeticExpression.Number(18)
let sum  = ArithmeticExpression.Addition(num1,num2)
let product = ArithmeticExpression.Multiplication(sum,ArithmeticExpression.Number(18))
print(evaluate(product))

猜你在找的Swift相关文章