《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






0 0