您的位置:首页 > 其它

正确的使用枚举(Enum)

2016-07-18 09:50 381 查看

状态与选项的区别(statesandoptions)

在用enum之前,我个人觉得,区分一下状态和选项的概念还是很必要的。

状态,同时只能有一种,如“OK”,“Error”,不可能同时是OK和Error。
选项,同时可以有一种或一种以上,如App可以同时支持横屏和竖屏,横屏竖屏在这个时候就是“屏幕方向”的两种不同的选项。

接下来,我们看看如何用枚举定义状态和选项。

enum与状态(states)

typedefenum_TTGState{
TTGStateOK=0,
TTGStateError,
TTGStateUnknow
}TTGState;

//指明枚举类型
TTGStatestate=TTGStateOK;


用的时候就如下:

-(void)dealWithState:(TTGState)state{
switch(state){
caseTTGStateOK:
//...
break;
caseTTGStateError:
//...
break;
caseTTGStateUnknow:
//...
break;
}
}


enum与选项(options)

选项,就是说一个“选项变量”的类型要能够同时表示一个或多个组合的选择,如下例子:

//方向,可同时支持一个或多个方向
typedefenum_TTGDirection{
TTGDirectionNone=0,
TTGDirectionTop=1<<0,
TTGDirectionLeft=1<<1,
TTGDirectionRight=1<<2,
TTGDirectionBottom=1<<3
}TTGDirection;


看,这里的选项是用位运算的方式定义的,这样的好处就是,我们的选项变量可以如下表示:

//用“或”运算同时赋值多个选项
TTGDirectiondirection=TTGDirectionTop|TTGDirectionLeft|TTGDirectionBottom;

//用“与”运算取出对应位
if(direction&TTGDirectionTop){
NSLog(@"top");
}
if(direction&TTGDirectionLeft){
NSLog(@"left");
}
if(direction&TTGDirectionRight){
NSLog(@"right");
}
if(direction&TTGDirectionBottom){
NSLog(@"bottom");
}




direction变量的实际内存如下:





这样,用位运算,就可以同时支持多个值。

enum在Objective-C中的“升级版”

一般来说,我们不能指定枚举变量的实际类型是什么,就是说,我们不知道枚举最后是int型,还是其他的什么类型。但是从C++11开始,我们可以为枚举指定其实际的存储类型,如下语法:

enumTTGState:NSInteger{/*...*/};


但是,我们在定义枚举的时候如何保证兼容性呢?Foundation框架已经为我们提供了更加“统一、便捷”的枚举定义方法,我们重新定义上面的例子:

//NS_ENUM,定义状态等普通枚举
typedefNS_ENUM(NSUInteger,TTGState){
TTGStateOK=0,
TTGStateError,
TTGStateUnknow
};

//NS_OPTIONS,定义选项
typedefNS_OPTIONS(NSUInteger,TTGDirection){
TTGDirectionNone=0,
TTGDirectionTop=1<<0,
TTGDirectionLeft=1<<1,
TTGDirectionRight=1<<2,
TTGDirectionBottom=1<<3
};


所以,在开发Mac、iOS程序中,最好所有的枚举都用“NS_ENUM”和“NS_OPTIONS”定义,保证统一。

总结

充分的用好枚举,可以增强代码的可读性,减少各种“错误”,让代码更加的规范。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: