枚举在开发中作用很大,多用来表示状态,选项,状态码。我们知道Object-C是基于C的,所以C的功能它都有,枚举类型就是其中的一个,枚举是一种常量命名方式,一个对象所经历的各种状态可以定义为一个枚举集。比如表示一天中吃饭的状态:
enum EatSomething { EatBreakfast, EatLunch, EatDinner, };
但是这么写在代码中定义枚举的方式却不是很简洁:
enum EatSonmething eatState = EatLunch;
为了简化定义步骤,去掉enum,需要在定义枚举时多加一步,使用typedef关键字重新定义枚举类型:
enum EatSomething { EatBreakfast, EatLunch, EatDinner, }; typedef enum EatSomething EatSonmething;
接下来就可以方便的定义枚举类型了:
EatSonmething eatState = EatLunch;
每一个状态都用一个便于理解的值表示,使得代码更易读。而且编辑器会自动为每一个状态分配编号,从0开始依次递增1。如果想要改变序号:
enum EatSomething { EatBreakfast = 2, EatLunch, EatDinner, }; /*第一项从2开始,后面依次递增1,为3,4*/
C++11修订了枚举的某些特征。其中一项就是:可以指明用何种“底层数据类型”来保存枚举类型的变量,这使得枚举类型可以向前声明,否则我们无从得知枚举的类型,也无法知道其数据类型大小并分配空间。若要指明其所用类型:
enum EatSomething : NSInteger{ /**/ };
有时候,我们在水平或垂直方向上调整视图大小时,会遇到几个枚举类型通过“按位或操作符”组合使用的场景:
typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) { UIViewAutoresizingNone = 0, UIViewAutoresizingFlexibleLeftMargin = 1 << 0, UIViewAutoresizingFlexibleWidth = 1 << 1, UIViewAutoresizingFlexibleRightMargin = 1 << 2, UIViewAutoresizingFlexibleTopMargin = 1 << 3, UIViewAutoresizingFlexibleHeight = 1 << 4, UIViewAutoresizingFlexibleBottomMargin = 1 << 5 };
从第二个开始依次是2的整数幂,由0开始,他们之间可以按照需要进行组合,比如要判断是否启用某个选项:
UIViewAutoresizing resizing = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; if(resizing & UIViewAutoresizingFlexibleWidth){ //UIViewAutoresizingFlexibleWidth is set }
系统框架中频繁使用这个方法,在UI框架的UIKit中还有一个支持设备显示方向的枚举类型叫UIInterfaceOrientationMask,需要实现一个名为supportedInterfaceOrientations的方法,将所要支持的显示方向告诉系统:
// 支持的屏幕方向,这个方法返回 UIInterfaceOrientationMask 类型的值。 - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft; }
在这里你会发现上面博主定义的枚举类型有不一样了:
enum 名字{ } . . . typedef NS_OPTIONS(类型, 名字){ }
在Foundation框架中定义了一些辅助的宏,用这些宏来定义枚举类型时,可指定用于保存枚举值的底层数据类型,它具有向后兼容的能力,如果目标平台的编辑器支持新标准,那就用新式语法,否则使用旧式语法。这些宏是用#define预处理指令来定义的,若要定义一个吃饭状态的枚举类型和一个类似UIViewAutoresizing这样包含一系列选项的枚举类型:
typedef NS_ENUM(NSUInteger, EatSomething) { EatBreakfast, EatLunch, EatDinner, }; typedef NS_OPTIONS(NSUInteger, LHHViewDirection) { LHHViewUp =1 << 0, LHHViewDown =1 << 1, LHHViewLeft =1 << 2, LHHViewRight =1 << 3, };
以上可知,若是定义的枚举可进行按位或组合,需要用NS_OPTIONS来定义,否则需用NS_ENUM来定义。
最后,在使用枚举时有一点要注意,特别是在switch中,我们总习惯加上一个default分支。但是若要用枚举的话最好不要加default分支,这样做,当新加入一个状态时编辑器会发出警告,提示新加入的状态未在switch分支中做处理,如果加上default分支,他就会来处理这个新的状态,编辑器不发出警告。在使用枚举时尤其要注意这点,通常要确保switch语句可以处理所有的样式。