(0064)iOS开发之枚举NS_ENUM和NS_OPTIONS的区别

参考:http://www.jianshu.com/p/693ff5c7c461


三种类型的枚举

enum 

iOS6之前一般我们采用C风格的enum关键字可以定义枚举类型

iOS6之后引入两个宏来定义枚举实际上是将enum定义和typedef合二为一,并且采用不同的宏来从代码角度来区分。

NS_ENUM 

普通枚举定义可参见UIKit.Framework

NS_OPTIONS 

位运算及特殊枚举的定义。什么时候要用到这种方式呢? 那就是一个枚举变量可能要代表多个枚举值的时候. 其实给一个枚举变量赋予多个枚举值的时候,原理只是把各个枚举值加起来罢了. 当加起来以后,就获取了一个新的值,那么为了保证这个值的唯一性,这个时候就体现了位运算的重要作用. 位运算可以确保枚举值组合的唯一性. 因为位运算的计算方式是将二进制转换成十进制,也就是说,枚举值里面存取的是 计算后的十进制值. 打个比方: 通过上面的位运算方式设定好枚举以后,打印出来的枚举值分别是: 1 2 4 8 16 5个数字,无论你如何组合在一起,也不会产生两个同样的数字.


这两个宏的定义在Foundation.frameworkNSObjCRuntime.h中:

#if (__cplusplus && __cplusplus >= 201103L && (__has_extension(cxx_strong_enums) || __has_feature(objc_fixed_enum))) || (!__cplusplus && __has_feature(objc_fixed_enum))

#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type  

#if (__cplusplus)

#define NS_OPTIONS(_type, _name) _type _name; enum : _type  

#else

#define NS_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type


#endif

#else  

#define NS_ENUM(_type, _name) _type _name; enum  

#define NS_OPTIONS(_type, _name) _type _name; enum  

#endif


//推荐的定义枚举类型的方式

typedef NS_ENUM(NSInteger, RWTLeftMenuTopItemType) {

 RWTLeftMenuTopItemMain, 

 RWTLeftMenuTopItemShows,

 RWTLeftMenuTopItemSchedule 

};

typedef NS_ENUM(NSInteger, RWTGlobalConstants) { 

RWTPinSizeMin = 1, 

RWTPinSizeMax = 5, 

RWTPinCountMin = 100, 

RWTPinCountMax = 500

}; 


typedef NS_OPTIONS(NSInteger, Test) {


TestA = 1, //1 1 1等于号后面必须等于1

TestB = 1 << 1, //2 2 10 转换成 10进制 2

TestC = 1 << 2, //4 3 100 转换成 10进制 4

TestD = 1 << 3, //8 4 1000 转换成 10进制 8

TestE = 1 << 4 //16 5 10000 转换成 10进制 16


};

//不推荐的方式

enum GlobalConstants { 

kMaxPinSize = 5, 

kMaxPinCount = 500

};


NS_OPTIONS枚举的用法

定义:

objective-c

//NS_OPTIONS,定义选项

typedef NS_OPTIONS(NSUInteger, MyOption) {

MyOptionNone = 0, //二进制0000,十进制0

MyOption1 = 1 << 0,//0001,1

MyOption2 = 1 << 1,//0010,2

MyOption3 = 1 << 2,//0100,4

MyOption4 = 1 << 3,//1000,8

};


##使用:


objective-c

//声明定义枚举变量

MyOption option = MyOption1 | MyOption2;//0001 | 0010 = 0011,3


//检查是否包含某选型

if ( option & MyOption3 ){ //0011 & 0100 = 0000

     //包含MyOption3

}else{

     //不包含MyOption3

}


//增加选项:

option = option | MyOption4;//0011 | 1000 = 1011, 11

//减少选项

option = option & (~MyOption4);//1011 & (~1000) = 1011 & 0111 = 0011, 3






CCF大数据与计算智能大赛-面向电信行业存量用户的智能套餐个性化匹配模型联通赛-复赛第二名-【多分类,embedding】.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值