ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Swift - 枚举

2022-04-29 16:34:59  阅读:160  来源: 互联网

标签:case 成员 枚举 let print 原始 Swift


前言

1 - Swift 中的枚举更加灵活!假定给枚举成员提供一个值(原始值),则该值的类型可以是字符串、字符、整型、浮点数

2 - 枚举成员可以指定任意类型的关联值存储到枚举成员中,就像其他语言中的联合体和变体。Swift 中枚举类型是一等类型

3 - 计算属性用于提供枚举值的附加信息;实例方法用于提供和枚举值相关联的功能

4 - 枚举也可以定义构造函数来提供一个初始值;可以在原始实现的基础上扩展它们的功能;还可以遵循协议来提供标准的功能

枚举

1 - Swift 和 C、Objective-C 不同,它枚举成员在被创建时不会被赋予一个默认的整型值

 1 enum CompassPoint {
 2     // 使用 case 关键字来定义枚举成员
 3     case north
 4     case south
 5     case east
 6     case west
 7 }
 8 
 9 // 多个成员值可以出现在同一行上,用逗号隔开
10 enum Planet {
11     case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
12 }
13 
14 // 赋值
15 // 方式一:标准
16 var directionToHead = CompassPoint.west
17 // 方式二:更为简短
18 directionToHead = .east
19 directionToHead = .south
20 
21 switch directionToHead {
22     
23 case.north:
24     print("Lots of planets have a north")
25 case.south:
26     print("Watch out for penguins") // 执行该分支
27 case.east:
28     print("Where the sun rises")
29 case.west:
30     print("Where the skies are blue")
31 }
32 
33 
34 // 使用 default 分支来涵盖所有未明确处理的枚举成员
35 let somePlanet = Planet.mercury
36 switch somePlanet {
37 case.earth:
38     print("Mostly harmless")
39 default:
40     print("Not a safe place for humans") // 执行该分支
41 }
42 
43 // 遍历成员:allCases
44 enum Beverage: CaseIterable {
45     case coffee, tea, juice
46 }
47 
48 let numberOfChoices = Beverage.allCases.count
49 print("\(numberOfChoices) beverages available")// 3 beverages available
50 for beverage in Beverage.allCases {
51     print(beverage)
52 }

2 - 关联值

 1 // 关联值
 2 enum Barcode {
 3     case upc(Int, Int, Int, Int)
 4     case qrCode(String)
 5 }
 6 
 7 var productBarcode = Barcode.upc(8, 85909, 51226, 3)// 元组
 8 // Barcode 型的常量、变量可以存储一个 .upc 或一个 .qrCode
 9 // Barcode.upc 被 Barcode.qrCode 所替代
10 productBarcode = Barcode.qrCode("ABCDEFGHIJKLMNOP")
11 
12 switch productBarcode {
13 case.upc(let numberSystem, let manufacturer, let product, let check):
14     print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")// 该分支不会执行
15 case.qrCode(let productCode):
16     print("QR code: \(productCode)") // 执行该分支
17 }
18 
19 
20 // 可以只在成员名称前标注一个 let或var,前提是一个枚举成员的所有关联值均是常量或变量
21 switch productBarcode {
22 case let.upc(numberSystem, manufacturer, product, check):
23     print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")
24 case let.qrCode(productCode):
25     print("QR code: \(productCode).")
26 }

3 - 原始值

 1 // 枚举成员可以被默认值(原始值)预填充,其类型必须相同
 2 //  ASCIIControlCharacter 的原始值类型被定义为 Character
 3 enum ASCIIControlCharacter: Character {
 4     case tab = "\t"
 5     case lineFeed = "\n"
 6     case carriageReturn = "\r"
 7 }
 8 
 9 // 原始值的隐式赋值
10 // 在使用原始值为整数或者字符串类型的枚举时,不需要显式地为每一个枚举成员设置原始值
11 enum PlanetNum2: Int {
12     // PlanetNum2.mercury 的显式原始值为 1,PlanetNum2.venus 的隐式原始值为 2,依次类推
13     case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
14 }
15 
16 // 当使用字符串作为枚举类型的原始值时,每个枚举成员的隐式原始值为该枚举成员的名称
17 // 比如 CompassPointNum2.south 拥有隐式原始值 south
18 enum CompassPointNum2: String {
19     case north, south, east, west
20 }
21 // rawValue 属性:访问该枚举成员的原始值
22 let earthsOrder = PlanetNum2.earth.rawValue          // 3
23 let sunsetDirection = CompassPointNum2.west.rawValue // west
24 
25 
26 // 使用原始值初始化枚举实例:在定义枚举类型时使用原始值,将会自动获得一个初始化方法
27 // 这个方法接收一个叫做 rawValue 的参数:参数类型即为原始值类型,返回值则是枚举成员或 nil
28 let possiblePlanet = PlanetNum2(rawValue: 7)// possiblePlanet 类型是 PlanetNum2? 值是 Planet.uranus
29 
30 // 并非所有 Int 值都可以找到一个匹配的行星,所以原始值构造器总是返回一个可选的枚举成员
31 let positionToFind = 11 // 返回 nillet positionToFind = 11
32 
33 // if 语句创建了一个可选 PlanetNum2,如果可选 PlanetNum2 的值存在,就会赋值给 somePlanet
34 if let somePlanet = PlanetNum2(rawValue: positionToFind) {
35     switch somePlanet {
36     case .earth:
37         print("Mostly harmless")
38     default:
39         print("Not a safe place for humans")
40     }
41 } else {
42     print("There isn't a planet at position \(positionToFind)")
43 }

注:原始值和关联值是不同的。原始值是在定义枚举时被预先填充的值,对于一个特定的枚举成员,它的原始值始终不变;关联值是创建一个基于枚举成员的常量或变量时才设置的值,枚举成员的关联值可以变化

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

 1 // 方式一
 2 enum ArithmeticExpression01 {
 3     // 纯数字
 4     case number(Int)
 5     // 相加
 6     indirect case addition(ArithmeticExpression01, ArithmeticExpression01)
 7     // 相减
 8     indirect case multiplication(ArithmeticExpression01, ArithmeticExpression01)
 9 }
10 
11 
12 // 方式二:在枚举类型开头加上 indirect 关键字来表明它的所有成员都是可递归的
13 indirect enum ArithmeticExpression02 {
14     case number(Int)
15     case addition(ArithmeticExpression02, ArithmeticExpression02)
16     case multiplication(ArithmeticExpression02, ArithmeticExpression02)
17 }
18 
19 // (5 + 4) * 2
20 let five = ArithmeticExpression01.number(5)
21 let four = ArithmeticExpression01.number(4)
22 let product = ArithmeticExpression01.multiplication(ArithmeticExpression01.addition(five, four), ArithmeticExpression01.number(2))
23 
24 
25 // 要操作具有递归性质的数据结构
26 func evaluate(_ expression: ArithmeticExpression01) -> Int {
27     
28     switch expression {
29         
30     // 如果是纯数字,就直接返回该数字的值
31     case let.number(value):
32         return value
33     case let.addition(left, right):
34         return evaluate(left) + evaluate(right)
35     case let.multiplication(left, right):
36         return evaluate(left) * evaluate(right)
37     }
38 }
39 print(evaluate(product)) // 18

 

标签:case,成员,枚举,let,print,原始,Swift
来源: https://www.cnblogs.com/self-epoch/p/16207078.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有