第五条:使用枚举类型表示状态和选项,可以使代码更加清晰,可读性更好。
枚举类型使用关键字enum定义,通常与typedef相结合,定义一组状态或选项:
typedef enum CustomState { CustomStateNone, CustomStateDefault, CustomStateAnother, } CustomState;此后,就可以像内建类型一样使用CustomState定义变量:
CustomState state = CustomStateDefault;
定义枚举型数据时,可以指定每个枚举成员的值,不过该方法一般不常用:
typedef enum CustomState { CustomStateNone = 1, CustomStateDefault, CustomStateAnother, } CustomState;
有些时候,可能需要对多个枚举选项同时选定,那么在定义枚举变量时,将每个选项按位进行置1即可:
typedef enum CustomState { CustomStateNone = 1, CustomStateDefault = 1<<1, CustomStateAnother = 1<<2, } CustomState;
这样,就可以用按位与的方式选择多个选项:
CustomState state = CustomStateDefault | CustomStateAnother;
在Foundation框架中,定义了两种辅助宏:NS_ENUM和NS_OPTION。使用两个宏定义枚举变量的方法如下:
typedef NS_OPTION(NSUInteger, CustomState) { CustomStateNone = 1, CustomStateDefault, CustomStateAnother, } CustomState; typedef NS_ENUM(NSUInteger, CustomState) { CustomStateNone = 1, CustomStateDefault, CustomStateAnother, } CustomState;
二者的区别在于当编译器不按照C++规则进行编译的时候体现。其原因在于,当存在按位或运算时,C++同非C++的处理办法略有不同。如果按照C++模式,那么编译器不允许在枚举中使用宏指定的类型来初始化枚举类型成员。上面使用NS_ENUM定义的枚举展开方式如:
typedef enum CustomState: NSUInteger CustomState; enum CustomState { CustomStateNone = 1; CustomStateDefault = 1<<1; CustomStateAnother = 1<<2; }
此时若存在以下调用:
CustomState state = CustomStateNone | CustomStateDefault;
那么当使用C++编译时将出现无法使用int类型初始化CustomState类型的错误。因此当存在按位或操作对多个选项进行组合的情况下,应使用NS_OPTION宏来定义枚举类型,如:
typedef NS_OPTION(NSUInteger, CustomState) { CustomStateNone = 1, CustomStateDefault = 1<<1, CustomStateAnother = 1<<2, } CustomState;