前言:oc中枚举的正确使用,可以增强代码的可读性,减少各种“错误”,让代码更加的规范。下面先介绍枚举的用法,最后介绍个人对枚举的理解,什么是枚举,为什么用枚举。
一. OC中,枚举的使用
1. 写法1格式:关键字 enum 枚举名字{枚举成员,枚举成员2};
1 /*
2 * 枚举 可以写在@interface 里面
3 **/
4 enum Test{
5 test = 1,
6 test1 = 2,
7 };
使用方法:enum 枚举名称 变量名称 = 枚举成员。
1 enum Test var = test;
2 NSLog(@"%u", var);
3 // 输出值为 1
注意:如果枚举成员不设置值,默认第一个枚举成员值为整型0,后续枚举成员值依次加1。
2.写法2格式,typedef enum 枚举名称{枚举成员}枚举别名;
1 /*
2 定义'枚举类型', Test11 是属性类型 相当于nsstring,int,。。
3 其中Test1 枚举名字可以省略不写,称“匿名枚举”
4 **/
5 typedef enum Test1{
6 test11 = 1,
7 test12 = 2,
8 }Test11;
使用方法:属性类型 变量名称 = 枚举成员;
1 Test11 var1 = test12;
2 NSLog(@"%u", var1);
3 // 输出值为 2
注意:typedef enum 定义的枚举,可以理解为枚举类型,相当于nsstring,int等,可用属性类型直接创建变量,然后完成赋值。
这种写法原有的枚举名称可以省略,称“匿名枚举”。
3.写法3,ios6之后,也是最标准的写法,更加的统一,规范。用“NS_ENUM”和“NS_OPTIONS”定义
格式:typedef NS_ENUM(存储类型,属性类型){枚举成员};
1 /*
2 * 存储类型,表示成员变量的值类型,如NSInteger
3 * 属性类型,上文说到的 枚举别名,可以此名称调用枚举
4 * 其中 NS_ENUM 多用于一般枚举,NS_OPTIONS 多用于位移枚举
5 **/
6 typedef NS_ENUM(NSInteger,Test6){
7 test61 = 1,
8 test62 = 2,
9 };
10
11 typedef NS_OPTIONS(NSUInteger, Test7) {
12 TestNone = 0,
13 TestA7 = 1 << 0,
14 TestB7 = 1 << 1,
15 TestC7 = 1 << 2,
16 TestD7 = 1 << 3
17 };
使用方法:属性别名 变量名称 = 枚举成员;
Test6 var6 = test62;
NSLog(@"%ld", (long)var6);
// 输出值为 2
Test7 var7 = TestA7 | TestC7;
NSLog(@"%ld", (long)var7);
// 输出值为 5
// 0001 | 0100 = 0101 十进制为5
注意:上面TestC7 1<<2,表示2进制1 左移2位,为0100,与0001 或运算,得到0101,转换十进制为5.
常用枚举用 NS_ENUM,NS_OPTIONS 多用于位移枚举,位的运算(或且非异或等)
二. 枚举错误的写法,编译时不会报错,但是运行报错
1 //错误写法1
2 enum {
3 test21 = 1,
4 test22 = 2,
5 }Test2;
6
7 //错误写法2
8 NS_ENUM(NSInteger,Test3){
9 test31 = 1,
10 test32 = 2,
11 };
12
13 //错误写法3
14 NS_OPTIONS(NSUInteger, Test4){
15 test41 = 1,
16 test42 = 2,
17 };
18
19 NS_OPTIONS(NSUInteger, Test5) {
20 TestA = 1 << 0,
21 TestB = 1 << 1,
22 TestC = 1 << 2,
23 TestD = 1 << 3
24 };
三. 枚举的理解
1.oc是基于c语言的,在c语言中枚举的定义
在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成这项工作,您的代码可能是:
1 #define MON 1
2 #define TUE 2
3 #define WED 3
4 #define THU 4
5 #define FRI 5
6 #define SAT 6
7 #define SUN 7
这样很繁琐,在此,我们定义一种新的数据类型,希望它能完成同样的工作。这种新的数据类型叫枚举型。
2.枚举用于规范的定义代码中的状态、选项等“常量”。
其中状态与选项的概念区别(states and options)
状态,同时只能有一种,如“OK”,“Error”,不可能同时是OK和Error。
选项,同时可以有一种或一种以上,如App可以同时支持横屏和竖屏,横屏竖屏在这个时候就是“屏幕方向”的两种不同的选项。
总结:
个人觉得枚举还是有必要掌握的,格式清晰,使用简便。能减少代码的冗余度,提高代码规范,增强可读性.