(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 165个数字,无论你如何组合在一起,也不会产生两个同样的数字.


这两个宏的定义在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






原创粉丝点击