开发中使用枚举的目的——为了增长代码的可读性markdown
NS_ENUM、NS_OPTIONS 这二者在本质上并无差异,都是用于定义枚举类型。但在使用中,NS_ENUM多用于通常枚举,而NS_OPTIONS则多用于带有移位运算的枚举。atom
在类的.h文件中,在interface和import之间。spa
一. NS_ENUM,定义状态等普通枚举code
typedef NS_ENUM(NSUInteger, myKeyBoardType) {
KeyBoardTypeDefault = 0,
KeyBoardTypeNumber,
KeyBoardTypeEmail
};
····
// myKeyBoardType为枚举命名,对应于某个属性
@property(nonatomic,assign)NSUInteger myKeyBoardType;
复制代码
状态枚举,不能共存,只能存在枚举值的其中一个。orm
二. NS_OPTIONS,定义选项 枚举的定义还支持 位运算的方式定义ci
typedef NS_OPTIONS(NSUInteger, TTGDirection) {
TTGDirectionNone = 0,
TTGDirectionTop = 1 << 0, //2 2 10 转换成 10进制 2
TTGDirectionLeft = 1 << 1, //4 3 100 转换成 10进制 4
TTGDirectionRight = 1 << 2, //8 4 1000 转换成 10进制 8
TTGDirectionBottom = 1 << 3 //16 5 10000 转换成 10进制 16
};
复制代码
这里的选项是用位运算的方式定义的,选项枚举中各值能够同时存在。开发
应用场景:一个枚举变量可能要表明多个枚举值的时候it
其实给一个枚举变量赋予多个枚举值的时候,原理只是把各个枚举值加起来罢了。当加起来之后,就获取了一个新的值,那么为了保证这个值的惟一性,这个时候就体现了位运算的重要做用。位运算能够确保枚举值组合的惟一性。 由于位运算的计算方式是将二进制转换成十进制,也就是说,枚举值里面存取的是 计算后的十进制值。打个比方: 经过上面的位运算方式设定好枚举之后,打印出来的枚举值分别是: 1 2 4 8 16 这5个数字,不管你如何组合在一块儿,也不会产生两个一样的数字。io
###使用 在须要的地方导入类文件,table
外界对属性myKeyBoardType进行赋值时,会直接提示枚举中的选项。
结合switch case 结构使用
typedef NS_ENUM(NSUInteger, MKButtonEdgeInsetsStyle) {
MKButtonEdgeInsetsStyleTop, // image在上,label在下
MKButtonEdgeInsetsStyleLeft, // image在左,label在右
MKButtonEdgeInsetsStyleBottom, // image在下,label在上
MKButtonEdgeInsetsStyleRight // image在右,label在左
};
@interface UIButton (ImageTitleSpacing)
@end
复制代码
//用“或”运算同时赋值多个选项
TTGDirection direction = TTGDirectionTop | TTGDirectionLeft | TTGDirectionBottom;
//用“与”运算取出对应位
if (direction & TTGDirectionTop) {
NSLog(@"top");
}
if (direction & TTGDirectionLeft) {
NSLog(@"left");
}
if (direction & TTGDirectionRight) {
NSLog(@"right");
}
if (direction & TTGDirectionBottom) {
NSLog(@"bottom");
复制代码