一、建立枚举
// 以下两种写法是等价的
enum Country {
case China, America, Russia
}
enum Country {
case China
case America
case Russia
}
二、Associated Value
定义
enum Test {
case A(a: String)
case B(b: Data)
case C(c: Int)
}
存取
let method = Test.A(a: "This is a")
// 第一种存取方式
switch method {
case .A(let a): // 或者 case .A(a: let a):
print("Desc: \(a)")
}
// 第二种存取方式
if case Test.A(let a) = method {
print(a)
}
三、Hashable
如果枚举没有 associated value
的话,默认就是 Hashable
的。
如果枚举有 associated value
,必须显示声明 Hashable
,如果枚举中的每一个值都是 Hashable
,那么就会自动提供 hash
方法。
四、RawValue
Swift 的枚举提供快速串接使用 String
、Int
、Float
、Double
作为 RawValue 的方法(前提是没有设置 associated value
)。数字类型会自动按照 case 顺序从 0 开始递增。
只需要在第一个位置声明具体的类型即可。
enum Test: String {
case A
case B = "我是 B"
case C
}
let a = Test.A
let b = Test.B
print(a.rawValue) // print: A
print(b.rawValue) // print: 我是 B
五、列举所有 Case
实现 CaseIterable
协议,就可以通过 allCases
来获取所有 case 的一个列表。
1. 通过迭代打印
enum Test: String, CaseIterable {
case A
case B = "我是 B"
case C
}
for test in Test.allCases {
print(test)
}
// print: A
// print: B
// print: C
2. 直接打印列表
直接打印的话是打印的默认自动生成的描述,如果想要打印 RawValue,可以实现 CustomStringConvertible
并实现 description
即可。如下所示:
// MARK: - 直接打印默认描述
enum Test: String, CaseIterable {
case A
case B = "我是 B"
case C
}
// print: [Algorithm.Test.A, Algorithm.Test.B, Algorithm.Test.C]
print(Test.allCases)
// MARK: - 打印 RawValue
enum Test: String, CaseIterable, CustomStringConvertible {
// 实现 description
var description: String {
rawValue
}
case A
case B = "我是 B"
case C
}
// print: [A, 我是 B, C]
print(Test.allCases)
六、将文本转 Case
可以通过 init
实例化枚举的时候传入文本来尝试将文本转为 case。
let test = Test.init(rawValue: "A")
// print: Optional(A)
print(test)