(0064)iOS开发之枚举NS_ENUM和NS_OPTIONS的区别
来源:互联网 发布:php中require once 编辑:程序博客网 时间:2024/05/24 01:00
参考: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.framework的NSObjCRuntime.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
- (0064)iOS开发之枚举NS_ENUM和NS_OPTIONS的区别
- iOS开发 枚举类型NS_ENUM和NS_OPTIONS的区别
- iOS-- NS_ENUM和NS_OPTIONS区别
- [iOS]详解枚举NS_ENUM与NS_OPTIONS的区别与说明
- NS_ENUM 和 NS_OPTIONS的区别
- typedef NS_OPTIONS和 typedef NS_ENUM的区别
- iOS:枚举enum,NS_ENUM,NS_OPTIONS 定义和 位运算应用
- iOS开发中 中NS_ENUM与NS_OPTIONS区别
- iOS: 枚举类型 enum,NS_ENUM,NS_OPTIONS
- iOS: 枚举类型 enum,NS_ENUM,NS_OPTIONS
- iOS: 枚举类型 enum,NS_ENUM,NS_OPTIONS
- iOS: 枚举类型 enum,NS_ENUM,NS_OPTIONS
- iOS: 枚举类型 enum,NS_ENUM,NS_OPTIONS
- iOS: 枚举类型 enum,NS_ENUM,NS_OPTIONS
- iOS 枚举类型 enum NS_ENUM NS_OPTIONS
- iOS: 枚举类型 enum,NS_ENUM,NS_OPTIONS
- iOS: 枚举类型 enum,NS_ENUM,NS_OPTIONS
- iOS: 枚举类型 enum,NS_ENUM,NS_OPTIONS
- 如何将oracle数据库恢复到指定日期
- POJ
- 物联网
- JAVA加载JAR包并调用JAR包中某个类的某个方法
- linux里面如何配置vim
- (0064)iOS开发之枚举NS_ENUM和NS_OPTIONS的区别
- 进程间通信之共享内存
- 正则化方法:L1和L2 regularization、数据集扩增、dropout
- 美团点评2012研发工程师笔试卷
- 全网最简单的C# json数据解析 无敌菜鸟教程 十分钟搞定json数据解析
- HDU-1232 畅通工程(并查集)
- 遥感影像几何纠正-正射校正-利用在线谷歌地图直接对影像进行几何校正
- 网络爬虫引发的问题及限制
- 写给喜欢数据分析的初学者