您的位置:首页 > 移动开发 > IOS开发

iOS开发 - 关于枚举

2017-03-28 10:47 148 查看
枚举在开发中作用很大,多用来表示状态,选项,状态码。我们知道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语句可以处理所有的样式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: