NS_ENUM
typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
UITableViewCellStyleDefault,
UITableViewCellStyleValue1,
UITableViewCellStyleValue2,
UITableViewCellStyleSubtitle
};
NS_ENUM 的第一个参数是用于存储的新类型的类型。在64位环境下,UITableViewCellStyle 和 NSInteger 一样有8bytes长。你要保证你给出的所有值能被该类型容纳,否则就会产生错误。第二个参数是新类型的名字。大括号里面和以前一样,是你要定义的各种值。
这种实现方法提取了之前各种不同实现的优点,甚至有提示编辑器在进行 switch 判断时检查类型匹配的功能。
NS_OPTIONS
enum 也可以被定义为按位掩码(bitmask)。
用简单的OR (|)和AND (&)数学运算即可实现对一个整型值的编码。
每一个值不是自动被赋予从0开始依次累加1的值,而是手动被赋予一个带有一个bit偏移量的值:类似1 << 0、 1 << 1、 1 << 2等。
语法和 NS_ENUM 完全相同,但这个宏提示编译器值是如何通过位掩码 | 组合在一起的。同样的,注意值的区间不要超过所使用类型的最大容纳范围。
定义:
//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
};
使用:
//声明定义枚举变量
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