在本章中,你将学会枚举的常见使用方法,包含但不限于枚举的创建、使用、遍历、关联值、原始值和递归。
前言
和Apple
官网或者网上分享的教程类文章不同,我将以实际开发角度讲述Swift
语言的一些概念和用法,方便大家更好地学习和掌握Swift
语言。
这同时也是对自己学习Swift
语言过程的知识整理。
如有错误,以你为准。
我们新建一个PlayGround
文件,命名为SwiftEnum
。
枚举的创建
枚举,是具有相同类型的一组值的集合。
在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))
以上就是本章的全部内容。
快来动手试试吧!