摘要訊息 : 學習 Switch 中的列舉.

0. 前言

本文于 2022 年 3 月 17 日进行一次更新和修正. 修正之后本文已经归档, 不再享受更新.

1. 枚举语法

enum 枚举名称 {
    枚举成员
}

例如, 现在想要创建一个上班人员等级系统 :

enum employee {
    case 总经理
    case 区域经理
    case 主管
    case 业务员
}

同样可以写成一行的形式 :

enum employee {
    case 总经理,区域经理,主管,业务员
}

2. 枚举成员的访问和编辑

enum employee {
    case 总经理
    case 区域经理
    case 主管
    case 业务员
}
print(employee.总经理)    //结果 : 总经理
var emp = employee.业务员
emp = .临时工
print(emp)    // 结果 : 临时工

3. 枚举值的遍历

我们通常使用 switch 语句进行枚举值的遍历 :

enum employee {
    case 总经理
    case 区域经理
    case 主管
    case 业务员
}
let emp = employee.总经理
switch emp {
    case employee.总经理 :
        print("您好, 总经理!")
    case employee.区域经理 :
        print("您好, 区域经理!")
    case employee.主管 :
        print("您好, 主管!")
    case employee.业务员 :
        print("您好, 业务员!")
}
print(emp)    // 结果 : 您好, 总经理!

4. 枚举的原始值

枚举成员可以使用相同类型的默认值, 这些默认值被称为枚举的原始值 :

enum gender : UInt8 {
    case male = 1
    case female = 2
    case unknown = 3
}

在操作存储整数或者字符串类型的原始值枚举的时候, Swift 可以自动为没有分配原始值的成员分配对应的原始值, 则可以得到上面代码的简化版本 :

enum gender : UInt8 {
    case male = 1, female, unknown
}

从第二个枚举成员开始, 后面每一个成员的原始值都比前一个成员的原始值大 1. 如果第一个成员没有对应的原始值, 那么 Swift 默认第一个成员原始值为 0. String 类型的原始值默认为成员本身.

Swift 中提供了 rawValue 属性来访问一个枚举成员的原始值 :

enum employee : Double {
    case 总经理
    case 区域经理
    case 主管
    case 业务员
}
let emp = employee.区域经理
print(emp.区域经理.rawValue)    // 结果 : 1.0
enum new_employee : String {
    case 总经理
    case 区域经理
    case 主管
    case 业务员
}
let new_emp = new_employee.区域经理
print(new_emp.区域经理.rawValue)    // 结果 : 总经理

5. 枚举的方法

如果你想在枚举中添加类似于函数一类的, 使枚举有更多的用途, 称为给枚举添加方法 :

enum gender : UInt8 {
    case male, female, unknown
    func description() {
        switch self {
            case .male :
                print("Hi, man!")
            case .female :
                print("Hi, lady!")
            case .unknown
                print("Hi!")
        }
    }
}
let people = gender.female
people.description()    // 结果 : Hi, lady!