第五条:用枚举表示状态、选项、状态码
枚举类型:enum
①枚举是一种常量命名方式。比如说:
enum EOCButtonType {
EOCButtonTypeCustom,
EOCButtonTypeSystem,
EOCButtonTypeDetailDisclosure,
};
编译器会为枚举分配一个独有的编号,从0开始,每个枚举递增+1。
当然,也可以不使用编译器分配的序号
enum EOCButtonType {
EOCButtonTypeCustom=1,
EOCButtonTypeSystem,
EOCButtonTypeDetailDisclosure,
};
上述代码把的值设为1,而不使用编译器所分配的0,接下来的几个枚举的值都会在上一个的基础上递增1,比如说,EOCButtonTypeDetailDisclosure的值就是3.
定义枚举的方式:
enum EOCButtonType type =UIButtonTypeDetailDisclosure;
用typedef关键字重新定义:(这样就不用每次定义时敲入enum而只需要写EOCButtonType了)
typedef enum EOCButtonType EOCButtonType;
EOCButtonType state =EOCButtonTypeDetailDisclosure;
指定底层数据类型:(若不指定底层数据类型,则无法向前声明枚举类型)
enum EOCButtonType:NSInteger{/*...*/};
向前声明时指定底层数据类型
enum EOCButtonType:NSInteger;
② 定义选项时,应该使用枚举类型,若选项之间可以(通过按位或操作符)彼此组合,则更应如此。
enum EOCButtonState {
EOCControlStateNormal = 0,
EOCControlStateHighlighted = 1 << 0,
EOCControlStateDisabled = 1 << 1,
EOCControlStateSelected = 1 << 2,
EOCControlStateFocused = 1 << 3,
};
可以通过按位或操作符如下定义:
enum EOCButtonState state= EOCControlStateHighlighted|
EOCControlStateSelected;
if(state&EOCControlStateNormal){
//此判读没有任何意义,只是为了说明可以如此使用
}
每个枚举值所对应的二进制表示中,只有一个二进制位的值是1。如下:
EOCControlStateHighlighted
EOCControlStateDisabled
EOCControlStateSelected
EOCControlStateFocused
用按位或操作符可组合多选项,例如:EOCControlStateHighlighted | EOCControlStateSelected
其二进制值为:
Foundation框架中定义了一些辅助的宏。
NS_ENUM(枚举不需要互相组合)
typedef NS_ENUM(NSInteger, UIControlContentVerticalAlignment) {
UIControlContentVerticalAlignmentCenter = 0,
UIControlContentVerticalAlignmentTop ,
UIControlContentVerticalAlignmentBottom ,
UIControlContentVerticalAlignmentFill ,
};
NS_OPTIONS(需要按位或操作来组合的枚举)
typedef NS_OPTIONS(NSUInteger, UIControlState) {
UIControlStateNormal = 0,
UIControlStateHighlighted = 1 << 0,
UIControlStateDisabled = 1 << 1,
UIControlStateSelected = 1 << 2,
UIControlStateFocused = 1 << 3,
};
这些宏可以指定用于保存枚举值的底层数据类型,具备向后兼容能力(如果目标平台的编译器支持新标准,那就使用新式语法,否则改用旧式语法)
③在switch语句中,枚举的使用
switch (_buttonType) {
case UIButtonTypeCustom:
//执行代码
break;
case UIButtonTypeSystem:
//执行代码
break;
case UIButtonTypeDetailDisclosure:
//执行代码
break;
}
在switch语句中最好不要有default分支。这样的话,如果之后又新增一种状态,那么编译器就会发出警告信息,提示新加入的状态并未在switch分支中处理。假如写上了default分支,那么它就会处理这个新状态,从而导致编译器不发警告信息。
来源:oschina
链接:https://my.oschina.net/u/2886189/blog/788490