正确的使用枚举(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”定义,保证统一。
总结
充分的用好枚举,可以增强代码的可读性,减少各种“错误”,让代码更加的规范。相关文章推荐
- web.xml配置详解
- 思维导图MindManager,入门知识学习
- cocoapods使用
- Hadoop加zookeeper搭建高可靠集群
- Android 开发环境 adt-bundle android-studio sdk adt 下载
- XZ_HTML之HTML图像
- 获取iOS项目名称及版本号
- 三级联动
- android快捷开发之Retrofit网络加载框架的简单使用
- OC学习总结之内存管理
- Spring 注入properties文件
- 安装虚拟机增加包--转自linux该这么学
- Yii2中cookie用法示例分析
- 路由器的Loopback地址是什么意思?
- Android,打包成jar,相关知识。20160514
- 数据仓库基础
- EntityFramework、Dapper vs 草根框架性能大比拼,数据库访问哪家强?
- js 中关于立即执行函数的个人理解
- Android酷炫实用的开源框架(UI框架)
- 提交AppStore被拒原因总结