《iOS移动开发从入门到精通》图书连载20:枚举

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 = 1
	case Female = 2
	case 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, Unknow
	func 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.Female
gender.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










评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李发展

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值