Swift实用小册07:枚举的创建、使用、遍历、关联值、原始值

简介: Swift实用小册07:枚举的创建、使用、遍历、关联值、原始值

image.png

在本章中,你将学会枚举的常见使用方法,包含但不限于枚举的创建、使用、遍历、关联值、原始值和递归。


前言


Apple官网或者网上分享的教程类文章不同,我将以实际开发角度讲述Swift语言的一些概念和用法,方便大家更好地学习和掌握Swift语言。

这同时也是对自己学习Swift语言过程的知识整理。


如有错误,以你为准。


我们新建一个PlayGround文件,命名为SwiftEnum

image.png

枚举的创建


枚举,是具有相同类型的一组值的集合。

Swift语言实际开发过程中,常常需要事先定义好一组值对应的枚举类型,然后在业务代码中引用。

我们使用enum关键词来创建枚举,而且在Swift语言中,枚举的名称需要大写开头,示例:


//枚举的创建
enum MealTimeName {
    case breakfast
    case lunch 
    case afternoonTea
    case supper
    case nightSnack
}


上述代码中,我们定义了一个MealTime餐段的枚举,我们使用case在这个枚举里定义了5个枚举的成员值。

我们也可以简化代码,示例:


//枚举的创建
enum MealTimeName2 {
    case breakfast,lunch,afternoonTea,supper,nightSnack
}


枚举的使用


在实际业务中,枚举常常作为一种类型,用于判断不同值的情况下,需要执行什么动作。

首先,我们定义一个变量,赋予一个初始值,这个值可以来源于枚举。示例:


//枚举的使用
var currentMealTime = MealTimeName.breakfast


当我们声明的变量类型确定的情况下,我们也可以通过省略声明方式和枚举的名称来简化代码,示例:


//枚举的使用
currentMealTime = .breakfast


然后,结合之前章节所学的Switch语句,我们可以匹配枚举的成员值,从而输出不同的结果。示例:


//枚举的使用
currentMealTime = .breakfast
switch currentMealTime {
case .breakfast:
    print("吃早餐啦!")
case .lunch:
    print("吃午饭啦!")
case .supper:
    print("吃晚饭啦!")
default:
    print("不是正餐")
}


上述代码中,我们声明了变量currentMealTime当前餐段,默认值为breakfast早餐,然后使用Switch语句匹配currentMealTime对应枚举MealTimeName的成员值,匹配到值后执行操作。因为我们这里不需要匹配所有的值,只需要匹配“正餐”,我们使用default分支来涵盖其他不需要匹配的值。


枚举的遍历


和遍历数组的方法类似,这里用来访问枚举范围的函数为allCases所有成员。但不同的是,在Swift4.2以后,我们的枚举还需要遵循CaseIterable协议,它是用于合成简单枚举类型的allCases 静态属性。示例:


//枚举的遍历
enum MealTimeName3:String,CaseIterable {
    case breakfast,lunch,afternoonTea,supper,nightSnack
}
print("\(MealTimeName3.allCases)")


上述代码中,枚举MealTimeName3遵循CaseIterable协议,我们就可以通过allCases访问枚举内的所有成员,我们这里打印输出枚举内的所有成员,结果为“breakfast,lunch,afternoonTea,super,nightSnack”。


枚举的关联值


在枚举定义过程中,如果每个枚举项都有附加的类型信息,即指定枚举的成员的输入类型,我们把这个附加信息叫做关联值。关联值是用来给枚举成员赋予更多信息,从而简化代码的,让代码结构更加清晰。示例:


//枚举的关联值
enum PowerType {
    case directload(String)
    case joinToken(String, String)
class WebViewController: UIViewController {
    let powerType: PowerType!
    init(powerType: PowerType) {
        self.powerType = powerType
        super.init(nibName: nil, bundle: nil)
    }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        switch self.powerType {
        case .directload(let url):
            //直接用url请求网页
            break
        case .joinToken(let url, let token):
            //用url拼接token后再加载网页
            break
        case .none: break
        }
    }
}


上述代码中,我们实现了一个app跳转网页的方法,它有两种情况,一是直接跳转,二是拼接token后,再跳转。在PowerType枚举中,我们使用了枚举关联值的方式,directload关联值带有String类型,joinToken关联值带2个String类型。


枚举的原始值


原始值,是为枚举项提供一个默认值。

如果我们需要指定枚举内成员值的类型和值对应的默认值,也可以在定义枚举的时候,给枚举附上类型以及给参数赋原始值。


//枚举的原始值
enum MealTimeType: Int{
    case breakfast = 1
    case lunch = 2
    case afternoonTea = 3
    case supper = 4
    case nightSnack = 5
}


上述代码中,我们给MealTimeType枚举定义其类型为Int整型,然后枚举内每个参数都赋予值了对应的原始值。定义好了原始值后,我们就可以用枚举项的 rawValue 属性来输出它。


//枚举的原始值
print("MealTimeType.breakfast.rawValue")
print(MealTimeType(rawValue:1))


image.png

以上就是本章的全部内容。

快来动手试试吧!


相关文章
|
4月前
|
Swift
Swift 中的枚举(Enum)
Swift 中的枚举(Enum)
25 2
|
数据安全/隐私保护 Swift
Swift实用小册26: 正则表达式的使用
在本章中,你将学会常用的正则表达式的使用方法。
254 3
Swift实用小册26: 正则表达式的使用
|
存储 Swift
Swift实用小册25: 高级运算符之位运算符的使用
在本章中,你将学会高级运算符的位运算符的使用方法。
206 0
Swift实用小册25: 高级运算符之位运算符的使用
|
数据安全/隐私保护 Swift 索引
Swift实用小册24: AccessControl访问控制的使用
在本章中,你将学会AccessControl访问控制的使用方法。
147 0
Swift实用小册24: AccessControl访问控制的使用
|
Swift
Swift实用小册23: ARC自动引用计数机制的使用
在本章中,你将学会ARC自动引用计数机制的使用方法。
150 0
Swift实用小册23: ARC自动引用计数机制的使用
|
Swift
Swift实用小册22: OpaqueTypes不透明类型的使用
在本章中,你将学会OpaqueTypes不透明类型的使用方法。
243 0
Swift实用小册22: OpaqueTypes不透明类型的使用
|
Swift
Swift实用小册21: Generics泛型的使用
在本章中,你将学会Generics泛型的使用方法。
149 0
Swift实用小册21: Generics泛型的使用
|
存储 前端开发 Swift
Swift实用小册20: Protocol协议的使用
在本章中,你将学会Protocol协议的使用方法。
221 0
Swift实用小册20: Protocol协议的使用
|
存储 前端开发 Swift
Swift实用小册19:Extension扩展的使用
在本章中,你将学会Extension扩展的使用方法。
313 0
Swift实用小册19:Extension扩展的使用
|
Swift
Swift实用小册18:NestedTypes嵌套类型的使用
在本章中,你将学会NestedTypes嵌套类型的使用方法。
186 0
Swift实用小册18:NestedTypes嵌套类型的使用