枚举类型,对程序员来说再熟悉不过了,但是,你确定你在正确得使用它吗?
在用枚举之前,让我们来区分一下状态和选项这两个概念。
状态:同时只能有一种。比如:一个POST请求的返回结果:要么成功,要么失败。这种情况下,成功和失败是POST请求的一种状态。
选项:同时可以有一种或者一种以上。比如:APP可以同时支持竖屏和横屏,这个时候横屏和竖屏就是屏幕方向的两个选项。
那么,我们怎么使用枚举来定义状态和选项呢?
状态
不好的写法(你可能经常见到的写法):
#define STATUS_FAIL 0
#define STATUS_SUCCESS 1
//用int变量直接接收
int status = STATUS_SUCCESS;
这样写的不恰当之处在于:
1.宏定义没有类型约束,只是单纯的替换;
2.无法限制状态的所有情况;比如:人为地把status赋值为3,程序可能就会出错找不到对应的状态,因为编译器不会对status=3提示警告。
正确的写法是:
typedef enum _ZXSTATUS{
ZXSTATUS_FAIL = 0,
ZXSTATUS_SUCCESS
}ZXSTATUS;
选项
举个例子:
typedef enum _ZXDirection{
ZXDirectionNone = 0,
ZXDirectionTop = 1 << 0,
ZXDirectionLeft = 1 << 1,
ZXDirectionRight = 1 << 2,
ZXDirectionBottom = 1 << 3,
}ZXDirection;
注意:这里的选项是用位运算的方式定义的,这样的好处就是,选项变量可以如下表示:
ZXDirection direction = ZXDirectionBottom | ZXDirectionTop;
所以,用位运算就可以同时支持多个值。
升级
C++ 11之前,我们是不能指定枚举的类型的,但是这之后,我们可以为枚举指定实际的存储类型。Foundation框架已经为我们提供了更加“统一、便捷”的枚举定义方法,我们重新定义上面的例子:
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”定义,保证统一。