在程序设计语言中,一般用一个数值来代表某一状态,这种处理方法不直观,易读性差。如果能在程序中用自然语言中有相应含义的单词来代表某一状态,则程序就很容易阅读和理解。也就是说,事先考虑到某一变量可能取的值,尽量用自然语言中含义清楚的单词来表示它的每一个值,这种方法称为枚举方法,用这种方法定义的类型称枚举类型。
定义的枚举类型名称通常与项目的类文件前缀相同,或者是类库框架缩写,或者跟随具体业务名,如果开头是缩写要大写表示,跟随其后的命名应采用驼峰命名法则,命名应准确表述枚举表示的意义,枚举中各个值都应以定义的枚举类型开头,其后跟随各个枚举值对应的状态、选项或者状态码。
1.枚举的实现方式
-
C语言枚举
typedef enum { GHTypeUp, GHTypeDown, }GHType; 复制代码
-
OC枚举: 强烈建议大家在日常编程中使用 OC 枚举
typedef NS_ENUM(NSUInteger, GHDemoType) { GHDemoTypeUp, GHDemoTypeDown }; 复制代码
-
位移枚举: 用于多值判断
typedef NS_OPTIONS(NSUInteger, GHOpertionType) { GHOpertionTypeUp = 1<<0, GHOpertionTypeDown = 1<<1, GHOpertionTypeLeft = 1<<2, GHOpertionTypeRight = 1<<3 }; 复制代码
2.举例
// 方法调用
[self demo:GHOpertionTypeUp | GHOpertionTypeDown | GHOpertionTypeLeft | GHOpertionTypeRight];
复制代码
// 方法实现
- (void)demo:(GHOpertionType)type {
if (type & GHOpertionTypeUp) {
NSLog(@"GHOpertionTypeUp");
}
if (type & GHOpertionTypeDown) {
NSLog(@"GHOpertionTypeDown");
}
if (type & GHOpertionTypeLeft) {
NSLog(@"GHOpertionTypeLeft");
}
if (type & GHOpertionTypeRight) {
NSLog(@"GHOpertionTypeRight");
}
}
复制代码
3.位移枚举的解释
首先你要知道以下这些知识:
-
<< 是左移运算符 : 用来将一个数的各二进制位全部左移若干位。
举个栗子 :0000 0001 代表 二进制中的 1 左移一位 <<1 就会变成 :0000 0010 代表 二进制中的 2 简便算法:8 << n的值为8 *(2^n) 复制代码
-
按位与运算 :&
1 & 1 = 1; 1 & 0 = 0; 0 & 0 = 0 总结规则:有0则为0 复制代码
-
按位或运算: |
1 | 1 = 1; 1 | 0 = 1; 0 | 0= 0 总结规则: 有1则为1 复制代码
以上可以推导出:
GHOpertionTypeUp : 0000 0001
GHOpertionTypeDown : 0000 0010
GHOpertionTypeLeft : 0000 0100
GHOpertionTypeRight : 0000 1000
复制代码
由第三点我们可知,GHOpertionTypeUp | GHOpertionTypeDown | GHOpertionTypeLeft | GHOpertionTypeRight 进行按位或运算后的结果为 : 0000 1111,再根据第二点,此值和GHOpertionTypeUp 进行按位与运算时得到的结果为 : 0000 0001,结果不为 0,也就会打印出 GHOpertionTypeUp,依次类推。
综上所述可以解释位移枚举为什么可以一个参数可以传递多个值,这也是位移枚举的优点。