PART_A 枚举简介
定义:一组相关的值定义了一个共同的枚举类型
语法格式
enum@H_404_21@ Direction { case@H_404_21@ East case@H_404_21@ South case@H_404_21@ West case@H_404_21@ North case@H_404_21@ NorthWest,EastSouth // 多个成员值在一行时,可用逗号分开@H_404_21@ }
类型推断
var@H_404_21@ currentDirection = Direction.East // 当类型已被推断出,可用简短语句(省略枚举类型名)来设置值:._@H_404_21@ currentDirection =.South
使用Switch匹配枚举值
switch需要穷举枚举成员,可以使用default分支来涵盖所有未明确处理的枚举成员
var@H_404_21@ currentDirection = Direction.East switch@H_404_21@ currentDirection { case@H_404_21@ .East: print@H_404_21@("East"@H_404_21@) case@H_404_21@ .South: print@H_404_21@("South"@H_404_21@) case@H_404_21@ .West: print@H_404_21@("West"@H_404_21@) case@H_404_21@ .North: print@H_404_21@("North"@H_404_21@) case@H_404_21@ .NorthWest,.EastSouth: print@H_404_21@("Other"@H_404_21@) default@H_404_21@: print@H_404_21@("Default"@H_404_21@) }
PART_B 关联值
定义:将枚举成员使用元组组合成关联值
注意:同一变量可被分配成不同类型的关联值,但同一时刻仅能存储为一种类型
语法格式
enum Person { case@H_404_21@ Male(String@H_404_21@,Int) case@H_404_21@ Female(String@H_404_21@,String@H_404_21@) } func test() { var@H_404_21@ p1 = Person.Male("zhangsan"@H_404_21@,28@H_404_21@) switch@H_404_21@ p1 { case@H_404_21@ .Male(let@H_404_21@ name,let@H_404_21@ age): print("\(name),\(age)"@H_404_21@) // 元组成员类型相同时,可提出类型至case后面@H_404_21@ case@H_404_21@ let@H_404_21@ .Female(name,desc): print("\(name),\(desc)"@H_404_21@) } }
PART_C1 原始值:原始值的类型必须相同
定义:即默认值. 对于一个特定的枚举成员,其原始值始终不变
说明
语法格式
enum@H_404_21@ OriginStr: String { case@H_404_21@ str1 = "hi"@H_404_21@ case@H_404_21@ str2 = "how are you"@H_404_21@ }
PART_C2 原始值的隐式赋值
当使用整数作为原始值,隐式赋值依次递增1. 若第一个枚举成员未设置原始值,默认为0
当使用字符串作为原始值,每个枚举成员的隐式原始值为该枚举成员的名称
// 枚举类型一、星球(整型)@H_404_21@ enum@H_404_21@ Planet: Int { case@H_404_21@ Mercury = 1@H_404_21@,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune } // 枚举类型二、方位(字符串)@H_404_21@ enum@H_404_21@ CompassPoint: String { case@H_404_21@ North,South,East,West } // 使用 rawValue 取默认原始值@H_404_21@ let@H_404_21@ earthsOrder = Planet.Earth.rawValue // earthOrder 值为 3@H_404_21@
使用原始值初始化枚举实例
let@H_404_21@ possiblePlanet = Planet(rawValue: 7@H_404_21@) // possiblePlanet类型为可选值:Planet?@H_404_21@ // 越界将返回 nil,否则将对应星球赋值给 possiblePlanet@H_404_21@
PART_D 递归枚举(indirect
):情况可被穷举时,适合数据建模
以下为解决案例:
(3 + 4) * 5
定义
方式一
enum@H_404_21@ ArithmeticExpression { case@H_404_21@ Num(Int) indirect case@H_404_21@ Add(ArithmeticExpression,ArithmeticExpression) indirect case@H_404_21@ Multiple(ArithmeticExpression,ArithmeticExpression) }
方式二:所有成员可递归时,将
indirect
放在enum
声明前indirect enum@H_404_21@ ArithmeticExpression2 { case@H_404_21@ Num(Int) case@H_404_21@ Add(ArithmeticExpression,ArithmeticExpression) case@H_404_21@ Multiple(ArithmeticExpression,ArithmeticExpression) }
// 定义运算方法@H_404_21@ func test(expression: ArithmeticExpression) -> Int { switch@H_404_21@ expression { case@H_404_21@ let@H_404_21@ .Num(value@H_404_21@): return@H_404_21@ value@H_404_21@ case@H_404_21@ let@H_404_21@ .Add(a,b): return@H_404_21@ test11(a) + test11(b) case@H_404_21@ let@H_404_21@ .Multiple(a,b): return@H_404_21@ test11(a) * test11(b) } }
// 调用运算方法、递归枚举进行运算 let three@H_404_21@ = ArithmeticExpression.Num(3@H_404_21@) let four@H_404_21@ = ArithmeticExpression.Num(4@H_404_21@) let sum@H_404_21@ = ArithmeticExpression.Add(three@H_404_21@,four@H_404_21@) let result@H_404_21@ = ArithmeticExpression.Multiple(sum@H_404_21@,ArithmeticExpression.Num(5@H_404_21@)) // result 值为 35@H_404_21@