如何正确使用枚举

枚举类型,对程序员来说再熟悉不过了,但是,你确定你在正确得使用它吗?

在用枚举之前,让我们来区分一下状态选项这两个概念。

状态:同时只能有一种。比如:一个POST请求的返回结果:要么成功,要么失败。这种情况下,成功和失败是POST请求的一种状态。
选项:同时可以有一种或者一种以上。比如:APP可以同时支持竖屏和横屏,这个时候横屏和竖屏就是屏幕方向的两个选项。

那么,我们怎么使用枚举来定义状态和选项呢?

状态

不好的写法(你可能经常见到的写法):

1
2
3
4
5
#define  STATUS_FAIL        0
#define STATUS_SUCCESS 1

//用int变量直接接收
int status = STATUS_SUCCESS;

这样写的不恰当之处在于:
1.宏定义没有类型约束,只是单纯的替换;
2.无法限制状态的所有情况;比如:人为地把status赋值为3,程序可能就会出错找不到对应的状态,因为编译器不会对status=3提示警告。

正确的写法是:

1
2
3
4
5
6
7
typedef enum _ZXSTATUS{
    
    ZXSTATUS_FAIL = 0,
    
    ZXSTATUS_SUCCESS

}ZXSTATUS;

选项

举个例子:

1
2
3
4
5
6
7
8
9
typedef enum _ZXDirection{
    
    ZXDirectionNone = 0,
    ZXDirectionTop = 1 << 0,
    ZXDirectionLeft = 1 << 1,
    ZXDirectionRight = 1 << 2,
    ZXDirectionBottom = 1 << 3,
    
}ZXDirection;

注意:这里的选项是用位运算的方式定义的,这样的好处就是,选项变量可以如下表示:

1
 ZXDirection direction = ZXDirectionBottom | ZXDirectionTop;

所以,用位运算就可以同时支持多个值。

升级

C++ 11之前,我们是不能指定枚举的类型的,但是这之后,我们可以为枚举指定实际的存储类型。Foundation框架已经为我们提供了更加“统一、便捷”的枚举定义方法,我们重新定义上面的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef NS_ENUM(NSUInteger,ZXStatus) {
    
    ZXStatusFail = 0,
    ZXStatusSuccess
};

typedef NS_OPTIONS(NSUInteger,ZXDirection) {
    
    ZXDirectionNone = 0,
    ZXDirectionTop = 1 << 0,
    ZXDirectionLeft = 1 << 1,
    ZXDirectionRight = 1 << 2,
    ZXDirectionBottom = 1 << 3,
};

所以,在Objective-C中,最好所有的枚举都用“NS_ENUM”和“NS_OPTIONS”定义,保证统一。

参考文章

文章目录
  1. 1. 状态
  2. 2. 选项
  3. 3. 升级