枚举表示状态,选项,状态码

之前也没看明白枚举的这个用法,百度了好久,然后发现有篇文章讲的还不错,地址下面给出..

枚举只是一种常量命名方式。某个对象所经历的各种状态就可以定义为一个简单的枚举集(enumeration set)。比如说,可以用下列枚举表示“套接字连接”(socket connection)的状态:
enum EOCConnectionState {
    EOCConnectionStateDisconnected,
    EOCConnectionStateConnecting,
    EOCConnectionStateConnected,
};

由于每种状态都用一个便于理解的值来表示,所以这样写出来的代码更易读懂。编译器会为枚举分配一个独有的编号,从0开始,每个枚举递增1。实现枚举所用的数据类型取决于编译器,不过其二进制位(bit)的个数必须能完全表示下枚举编号才行。在前例中,由于最大编号是2,所以使用1个字节的char类型即可。

然而定义枚举变量的方式却不太简洁,要依如下语法编写:
enum EOCConnectionState state = EOCConnectionStateDisconnected;

若是每次不用敲入enum而只需写EOCConnectionState就好了。要想这样做,则需使用typedef关键字重新定义枚举类型:
enum EOCConnectionState {
    EOCConnectionStateDisconnected,
    EOCConnectionStateConnecting,
    EOCConnectionStateConnected,
};

typedef enum EOCConnectionState EOCConnectionState;

现在可以用简写的EOCConnectionState来代替完整的enum EOCConnectionState了:

EOCConnectionState state = EOCConnectionStateDisconnected;

C++11标准修订了枚举的某些特性。其中一项改动是:可以指明用何种“底层数据类型”(underlying type)来保存枚举类型的变量。这样做的好处是,可以向前声明枚举变量了。若不指定底层数据类型,则无法向前声明枚举类型,因为编译器不清楚底层数据类型的大小,所以在用到此枚举类型时,也就不知道究竟该给变量分配多少空间。

指定底层数据类型所用的语法是:
enum EOCConnectionStateConnectionState : NSInteger { /* ... */ };

上面这行代码确保枚举的底层数据类型是NSInteger。也可以在向前声明时指定底层数据类型:

enum EOCConnectionStateConnectionState : NSInteger;

还可以不使用编译器所分配的序号,而是手工指定某个枚举成员所对应的值。语法如下:
enum EOCConnectionStateConnectionState {
    EOCConnectionStateDisconnected = 1,
    EOCConnectionStateConnecting,
    EOCConnectionStateConnected,
};

上述代码把EOCConnectionStateDisconnected的值设为1,而不使用编译器所分配的0。如前所述,接下来几个枚举的值都会在上一个的基础上递增1。比如说,EOCConnectionState-Connected的值就是3。

还有一种情况应该使用枚举类型,那就是定义选项的时候。若这些选项可以彼此组合,则更应如此。只要枚举定义得对,各选项之间就可通过“按位或操作符”(bitwise OR operator)来组合。例如,iOS UI框架中有如下枚举类型,用来表示某个视图应该如何在水平或垂直方向上调整大小:
enum UIViewAutoresizing {
    UIViewAutoresizingNone                 = 0,
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
    UIViewAutoresizingFlexibleWidth        = 1 << 1,
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
    UIViewAutoresizingFlexibleHeight       = 1 << 4,
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5,
}

每个选项均可启用或禁用,使用上述方式来定义枚举值即可保证这一点,因为在每个枚举值所对应的二进制表示中,只有1个二进制位的值是1。用“按位或操作符”可组合多个选项,例如:UIViewAutoResizingFlexibleWidth| UIViewAutoresizingFlexibleHeight。用“按位与操作符”(bitwise AND operator)即可判断出是否已启用某个选项:
enum UIViewAutoresizing resizing =
    UIViewAutoresizingFlexibleWidth |
    UIViewAutoresizingFlexibleHeight;
if (resizing & UIViewAutoresizingFlexibleWidth) {
       // UIViewAutoresizingFlexibleWidth is set
}

 还有关于设备显示方向的枚举用法,小伙伴们请移步这里:http://book.2cto.com/201404/42076.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值