用枚举表示状态,选项,状态码
枚举只是一种常量的命名方式。例如枚举表示“套接字链接”的状态:
enum EOCConnectionState{
EOCConnectionStateDisconnected,
EOCConnectionStateConnecting,
EOCConnectionStateConnected,
};
由于每种状态都用一个便于理解的值来表示,所以这让代码更易读懂。编译器会为枚举分配独有的编号,从0开始,每个枚举递增1。
定义枚举变量语法:
enum EOCConnectionState state = EOCConnectionStateDisconnected;
这样每次需要敲入enum,不方便。所以一般定义一个typedef关键字重新定义一下枚举类型。
typedef enum EOCConnectionState EOCConnectionState;
在c++11标准修订了枚举的一些特性,其中之一为,可以指明用何种“底层数据类型”来保存枚举类型的变量。语法如下:
//确保枚举的底层数据类型为NSInteger。
enum EOCConnectionState:NSInteger {
EOCConnectionStateDisconnected,
EOCConnectionStateConnecting,
EOCConnectionStateConnected,
};
// 也可以不使用编译器分配的序号,自己手动设定一个美剧成员对应的值。例如:
enum EOCConnectionState:NSInteger {
EOCConnectionStateDisconnected = 1,
EOCConnectionStateConnecting,
EOCConnectionStateConnected,
};
//设置EOCConnectionStateDisconnected的值为1,后面的枚举依次递增1。EOCConnectionStateConnected的枚举值为3。
还有一种情况使用枚举类型,那就是定义选项的时候。选项可以彼此组合,只要枚举定义的对,各个选项之间可以通过“按位操作符”来组合。例如:
enum UIViewAutoresizings{
UIViewAutoresizingsNone = 0,
UIViewAutoresizingsFlexibleLeftMargin = 1 << 0,
UIViewAutoresizingsFlexibleWidth = 1 << 1,
UIViewAutoresizingsFlexibleRightMargin = 1 << 2,
UIViewAutoresizingsFlexibleTopMargin = 1 << 3,
};
enum UIViewAutoresizings resizing = UIViewAutoresizingsFlexibleLeftMargin| UIViewAutoresizingsFlexibleWidth;
Foundation 框架中定义了一些辅助宏,用这些宏来定义枚举类型时,也可以指定用于保存枚举值的底层数据类型。例如:
//凡是需要以按位操作来组合的枚举都应该用NS_OPTIONS定义
typedef NS_OPTIONS(NSUInteger, EOCPermittedDirection) {
EOCPermittedDirectionUp = 1 << 0,
EOCPermittedDirectionDown = 1 << 1,
EOCPermittedDirectionLeft = 1 << 2,
EOCPermittedDirectionRight = 1 << 3,
};
// 不用枚举互相组合,则使用NS_ENUM来定义
typedef NS_ENUM(NSUInteger, EOCConnectionState) {
EOCConnectionStateDisconnected,
EOCConnectionStateConnecting,
EOCConnectionStateConnected,
};
枚举在switch语句的用法。
typedef NS_ENUM(NSUInteger, EOCConnectionState) {
EOCConnectionStateDisconnected,
EOCConnectionStateConnecting,
EOCConnectionStateConnected,
};
------------------------------------------------------
switch (_currentState) {
case EOCConnectionStateDisconnected:
// 逻辑代码
break;
case EOCConnectionStateConnecting:
// 逻辑代码
break;
case EOCConnectionStateConnected:
// 逻辑代码
break;
}
在枚举定义的状态的switch语句里,最好不要用default。这样的话,在后面加上的种新状态,那么编译器就会发出警告信息,提示switch分支里没有这种新状态。如果加了default就会走default分支,就不会发出警告。
总结要点:
- 应该用枚举来表示状态机的状态,传递给方法的选项以及状态码等值,给这些值取一个易懂的名字。
- 如果使用组合枚举类型,就用按位或操作定义选项值。
- 凡是需要以按位操作来组合的枚举都应该用NS_OPTIONS定义,不用枚举互相组合,则使用NS_ENUM来定义
- 在枚举定义的状态的switch语句里,最好不要用default。