枚举:规范的定义代码中的状态、状态码、选项。
强调内容枚举和宏(#define)非常相似:宏在预处理阶段将名称替换成对应值,枚举在编译阶段将名称替换成对应的值。可以将枚举理解成编译阶段的宏。
由C引入:
//格式:
enum typeName(valueName1,valueName2,valueName3,...);
enum:关键字,专用于定于枚举类型。
typeName:枚举类型的名称。
valueName1,valueName2,..:每个值对应的名称的列表。
如:
enum Season{
Spring,
Summer,
Autumn,
Winter
};
定义中只给出了名称,没有给出名称对应的值,因为枚举值默认从0开始,往后依次递增1。也可以自己定义值。
如:
enum Season{
Spring = 0,
Summer = 1,
Autumn = 2,
Winter = 3
};
枚举是一种类型,可以定义枚举变量:
- 声明的同时定义变量:
enum Season{
Spring = 0,
Summer = 1,
Autumn = 2,
Winter = 3
}a,b,c;
- 直接定义变量:
enum Season a,b,c;
通过typedef可以为枚举类型设置起一个”别名”,这样可以像其他数据类型一样使用枚举值来定义变量。
typedef enum{
TestA,
TestB,
TestC
} Test;
或
typedef enum _Test{
TestA,
TestB,
TestC
} Test;
使用别名后,便可以根据类型定义枚举变量:
Test test = TestB;
Object-C中的枚举:
在Object-C中,iOS6引入了两个宏来重新定义枚举类型:NS_ENUM、NS_OPTIONS。两者本质上没有差别,都是用于定义枚举类型,但前者NS_ENUM用于定义一般枚举,后者NS_OPTIONS用于带有移位运算的枚举,用于一个枚举变量可以同时赋值多个枚举值的情况。
typedef NS_ENUM(NSInteger , Season) {
Spring,
Summer,
Autumn,
Winter
};
typedef NS_OPTIONS(NSUInteger, Options) {
Aoptions = 1,
Boptions = 1 << 1 ,
Coptions = 1 << 2
};
使用NS_OPTIONS定义枚举值的时候,一个枚举变量可以同时赋值多个枚举值,原理是把各个枚举值加起来。加起来以后,就获取了一个新的值,因为每个枚举值都是使用的位运算符,所以都是唯一性,根据得到的值可以反推出各枚举值,位运算可以确保枚举值的唯一性。
判断枚举变量是否包含某个固定的枚举值:
Options option = Aoptions|Boptions;
if (Aoptions & option) {
NSLog(@"有");
}else{
NSLog(@"没有");
}
if (option & Boptions) {
NSLog(@"有");
}else{
NSLog(@"没有");
}
if (option & Coptions) {
NSLog(@"有");
}else{
NSLog(@"没有");
}