《iOS移动开发从入门到精通》图书连载20:枚举
来源:互联网 发布:回收站清空数据恢复 编辑:程序博客网 时间:2024/06/06 18:25
4.2.1 枚举
在实际应用中,有的变量只有几种取值的选择。如人的性别只有两种取值(也可能是三种),星期则只有七种可能的取值范围。其它的还有:月份、颜色、学历、职位之类等等。
在Swift语言中对这样取值比较特殊的变量,可以定义为枚举类型。所谓枚举是指将变量的值一一列举出来,变量只限于在列举出来的值的范围内进行取值。
在程序设计语言中,一般用一个数值来代表某一状态,这种处理方法不直观,易读性差。如果能在程序中,用自然语言中的有相应含义的单词来代表某一状态,则程序就很容易阅读和理解。也就是说,事先考虑到某一变量可能的取值范围,尽量用自然语言中含义清楚的单词,来表示它的每一个值,这种方法称为枚举方法,用这种方法定义的类型称为枚举类型。
Swift 语言中的枚举类型更加灵活,并且不需给枚举中的每一个成员都提供值。在Swift中,枚举可以支持字符串、字符、整数和浮点类型,作为枚举成员的数据类型。
枚举语法
枚举的定义需要使用enum关键字,枚举的成员则被放置在一对大括号之中:
enum 枚举名称{ // 此处放置枚举的成员}
//当我们需要创建一个具有用户等级的系统时,就可以把用户的等级定义为枚举类型:enum UserLevel{case 总经理case 区域经理case 主管case 业务员}
当我们需要创建一个具有用户等级的系统时,就可以把用户的等级定义为枚举类型:
在UserLevel枚举中定义的值:总经理、区域经理、主管、业务员等内容,就是枚举的成员值或成员,通过case关键字明确要定义的成员值。
在定义枚举时,如果枚举成员比较少,您可以将枚举成员放置在一行之中。例如,您可以将
UserLevel枚举修改为:
enum UserLevel{case 总经理, 区域经理, 主管, 业务员}
这两种方式,都可以完成枚举的定义。
和Object-C不同的是,Swift 的枚举成员在被创建时,不会被赋予一个默认的整数值。例如,在上面的UserLevel枚举中,总经理、区域经理、主管和业务员等成员,它们的值并不会隐式的等于0,1,2和3。
此外,和Swift中的其他类型一样,枚举的名字例如UserLevel,推荐以一个大写字母开头,以便于读起来更加容易理解:
print(UserLevel.业务员) //输出结果为:业务员
当您定义一个枚举类型的常量或变量时,在输入枚举名称和半角句号之后,系统会自动弹出枚举列表,以方便您的选择,如图4-2-1所示:
图4-2-1
当userLevel变量被声明为一个UserLevel枚举类型时,您可以通过使用更快捷的点(.)语法,将其修改为另一个UserLevel的成员值:
var userLevel = UserLevel.业务员userLevel = .区域经理
在已知userLevel变量的类型时,当设定它的值时,您可以不必再写类型名。但是仍然推荐使用显示类型的枚举值,这样可以让代码具有更好的可读性。
枚举值的遍历
通常使用switch语句进行枚举值的遍历操作:
let userLevel = UserLevel.业务员switch userLevel{case UserLevel.总经理:print("总经理登陆系统后,进入系统配置页面。")case UserLevel.区域经理:print("区域经理登陆系统后,进入区域报表页面。")case UserLevel.主管:print("主管登陆系统后,进入业务员任务签发页面。")case UserLevel.业务员:print("业务员登陆系统后,进入报备客户页面。")}
通过switch语句,对userLevel常量进行枚举的遍历,然后根据用户的级别,在用户登陆系统后,进入各自级别对应的页面。
就像在条件控制流中所描述的那样,当判断一个枚举成员时,switch语句应该是对所有的枚举值全覆盖的,否则就需要使用default语句,以包含未被明确处理的枚举值:
let userLevel = UserLevel.业务员switch userLevel{case UserLevel.业务员:print("业务员登陆系统后,进入报备客户页面。")default:print("无法进入客户报备页面,请重新登陆!")}
在上面的示例中,使用default语句,处理当用户使用非业务员账号登陆系统的情况。
枚举的原始值
枚举成员可以用相同类型的默认值,这些默认值被称为枚举的原始值:
enum Gender : UInt8{case Male = 1case Female = 2case Unknow = 3}
在第一行代码中,定义了一个名为Gender的枚举,其原始值的类型为UInt8,枚举的三个成员的值依次是1、2、3。
当您在操作存储整数或字符串类型的原始值枚举的时候,您不必显式地给每一个成员都分配一个原始值。Swift 将会自动为没有分配原始值的成员,分配对应的原始值。以下代码是对上一个枚举示例设置原始值的简化版本:
enum Gender : UInt8{case Male = 1, Female, Unknow}
当整数值被用作原始值时,每成员的隐式值都比前一个值大1。如果第一个成员没有值,那么它的值是0。在上面的例子中,Gender. Male有一个明确的原始值1,则Gender. Female的隐式原始值是2,以此类推。
您可以用 rawValue属性,来访问一个枚举成员的原始值:
print(Gender.Female.rawValue) //输出结果为:2
如果您用原始值类型来定义一个枚举,那么枚举就会自动收到一个可以接受原始值类型的值的初始化器,然后返回一个枚举成员或者nil。
您可以使用这个初始化器来尝试创建一个枚举的新实例:
let gender = Gender(rawValue:2)print(gender) //输出结果为:Optional(Gender.Female)
给枚举添加方法
和Object-C语言中的枚举不同,您可以为Swift的枚举添加方法:
enum Gender : UInt8{case Male, Female, Unknowfunc description(){switch self{case .Male:print("Hi, man!")case .Female:print("Hi, lady!")case .Unknow:print("Hi...")}}}
在第4至15行的代码中,为Gender枚举添加了一个名为description的方法,在该方法体内,通过switch语句,遍历枚举的值,并相应地打印输出不同的内容。
调用枚举的方法也很简单:
let gender = Gender.Femalegender.description() //输出结果为:Hi, lady
新 作
iOS开发中的神兵利器
共140节课程,讲解GitHub中近百个过千star的iOS热门开源项目
市面上唯一大规模讲解GitHub中热门的iOS开源项目的教程
快速、优雅地解决iOS开发工作中遇到的各种棘手问题
视频观看地址:http://study.163.com/course/courseMain.htm?courseId=1003657013
互动教程下载地址:https://itunes.apple.com/cn/app/id1209739676
- 《iOS移动开发从入门到精通》图书连载20:枚举
- 《iOS移动开发从入门到精通》图书连载2:如何成为一名iOS开发者
- 《iOS移动开发从入门到精通》图书连载4:iOS应用的生命周期
- 《iOS移动开发从入门到精通》图书连载7:iOS模拟器的使用
- 《iOS移动开发从入门到精通》图书连载5:Xcode 8的使用(上)
- 《iOS移动开发从入门到精通》图书连载8:Swift的基本概念(上)
- 《iOS移动开发从入门到精通》图书连载9:Swift的基本概念(下)
- 《iOS移动开发从入门到精通》图书连载11:字符和字符串
- 《iOS移动开发从入门到精通》图书连载15:数组
- 《iOS移动开发从入门到精通》图书连载16:字典
- 《iOS移动开发从入门到精通》图书连载17:函数的定义和调用
- 《iOS移动开发从入门到精通》图书连载18:函数作为参数和返回类型
- 《iOS移动开发从入门到精通》图书连载19:函数的嵌套
- 《iOS移动开发从入门到精通》图书连载3:如何创建一个基本的iOS项目?
- 《iOS移动开发从入门到精通》图书连载6——Xcode8的使用(下)
- 《iOS移动开发从入门到精通》图书连载13:for循环、while循环语句、repeat-while循环语句
- 《iOS移动开发从入门到精通》图书连载一:如果你也想开发一款自己的APP,可以看一下这篇文章
- 《iOS移动开发从入门到精通》图书连载10:布尔类型、Int类型及实例属性、浮点类型及实例属性
- 创建对象之构造函数模式
- 04-android生命周期
- 清北学堂游记(2)
- POJ 3253 fence repair [STL][priority_queue]
- PAT(甲级)1077. Kuchiguse (20)
- 《iOS移动开发从入门到精通》图书连载20:枚举
- Gif截图工具——GifCam
- 机器学习实战之决策树
- android 使用RxJava实现预加载
- 《Spark商业案例与性能调优实战100课》第14课:商业案例之纯粹通过DataSet进行电商交互式分析系统中特定时段购买金额Top10 和访问次数增长Top10
- 【Hibernate】——缓存
- 【排序】时间复杂度为O(N^2)的排序——冒泡、选择和插入排序
- Dear 清明
- 寒假学习之stm32(3)----串口讲解