IOS 枚举 enum
前言: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可以同时支持横屏和竖屏,横屏竖屏在这个时候就是“屏幕方向”的两种不同的选项。
总结:
个人觉得枚举还是有必要掌握的,格式清晰,使用简便。能减少代码的冗余度,提高代码规范,增强可读性.
ps:第一次总结,有错误之处还请指正,thanks,荆轲刺秦王~~
参考文档1:https://www.cnblogs.com/JCSU/articles/1299051.html
参考文档2:https://blog.csdn.net/snow_xuey/article/details/55258875
参考文档3:https://blog.csdn.net/imkata/article/details/78861077