枚举类型
- 枚举的作用在于规范并语义化的定义代码中的状态、选项等常量。
- 如果一个变量只有几种可能的值,比如星期几的变量,只有星期一、星期二、星期三、星期四、星期五、星期六、星期天这7个值,就可以使用枚举类型(春夏秋冬、上下左右、东西南北等)
- 枚举类型的定义以关键字enum开头,之后是枚举数据类型的名称,最后是在一对花括号内的选项标识符序列。 (实现枚举所用的数据类型取决于编译器。除了使用默认类型,还可以指明用何种“底层数据类型”来保存枚举类型的变量)
enum Direction {up, down, left, right};
enum Direction : UNSInteger {up, down, left, right};
- 编译器会为枚举分配一个独有的编号,从0开始,每个枚举递增1。(可以手动指定某个枚举成员所对应的值,接下来的枚举值会在上一个的基础上递增1)
- 枚举变量的本质就是无符号整数(%u占位符)
// up=1,down=2,left=3,right=4
enum Direction {up = 1, down, left, right};
// 定义匿名枚举类型,并定义两个枚举变量
enum {male, female} me, you;
- 使用关键字typedef重新定义枚举,目的是为了简化枚举的声明,不需要每次都写enum
// 使用关键字typedef定义枚举类型
enum Direction {up, down, left, right} ;
typedef enum Direction Direction;
// 使用Direction代替完整的enum Direction
Direction var1, var2;
基础使用方法:
typedef enum _State {
StateOK = 0,
StateError,
StateUnknow
} State;
// 指明枚举类型
State status = StateOK;
- (void)dealWithState:(State)state {
switch(state) {
case StateOK:
break;
case StateError:
break;
case StateUnknow:
break;
}
}
- 枚举的另一种使用方式是定义为按位掩码,当定义选项的时候,若这些选项可以彼此组合,则在设置特定的枚举值后,各选项间就可通过“按位或”来组合。因为每个枚举值所对应的二进制表示中,只有1个二进制位的值是1,所以多个选项“按位或”后的组合值是唯一的,且将某一选项与组合值做“按位与”操作,即可判断出组合值中是否包含该选项。
enum Direction {
up = 1 << 0,
down = 1 << 1,
left = 1 << 2,
right = 1 << 3
};
选项使用方法
//方向,可同时支持一个或多个方向
typedef enum _Direction {
DirectionNone = 0,
DirectionTop = 1 << 0 // 0001
DirectionLeft = 1 << 1, // 0010
DirectionRight = 1 << 2, // 0100
DirectionBottom = 1 << 3 // 1000
} Direction;
//用“或”运算同时赋值多个选项
Direction direction = DirectionTop | DirectionLeft | DirectionBottom; // 1011
//用“与”运算取出对应位
if (direction & DirectionTop) { // 1011 & 0001
NSLog(@"top");
}
if (direction & DirectionLeft) { // 1011 & 0010
NSLog(@"left");
}
if (direction & DirectionRight) { // 1011 & 0100
NSLog(@"right");
}
if (direction & DirectionBottom) { // 1011 & 1000
NSLog(@"bottom");
}
/*
打印的结果
2017-10-30 16:39:35.584816+0800 OBJC_TEST[5215:236112] top
2017-10-30 16:39:35.584825+0800 OBJC_TEST[5215:236112] left
2017-10-30 16:39:35.584831+0800 OBJC_TEST[5215:236112] bottom
*/
enum在Objective-C中的“升级版”
- 从C++ 11开始,我们可以为枚举指定其实际的存储类型
enum State : NSInteger {/*...*/};
- 保证枚举类型的兼容性,推荐使用NS_ENUM和NS_OPTIONS
// NS_ENUM,定义状态等普通枚举类型
typedef NS_ENUM(NSUInteger, State) {
StateOK = 0,
StateError,
StateUnknow
};
// NS_OPTIONS,定义可组合选项的枚举类型
typedef NS_OPTIONS(NSUInteger, Direction) {
DirectionNone = 0,
DirectionTop = 1 << 0,
DirectionLeft = 1 << 1,
DirectionRight = 1 << 2,
DirectionBottom = 1 << 3
};