一、建立枚举
// 以下两种写法是等价的
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)
