美文网首页程序员
如何正确使用枚举

如何正确使用枚举

作者: 啃手高手 | 来源:发表于2016-03-09 23:03 被阅读605次

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

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

状态:同时只能有一种。比如:一个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”定义,保证统一。

参考文章

相关文章

  • 如何正确使用枚举

    枚举类型,对程序员来说再熟悉不过了,但是,你确定你在正确得使用它吗? 在用枚举之前,让我们来区分一下状态和选项这两...

  • ios高效开发-正确的使用枚举(Enum)

    ios高效开发-正确的使用枚举(Enum)

  • 枚举

    如何定义枚举类 什么枚举类:类里的对象是有限个,可以枚举出来 如何使用enum定义枚举类 枚举...

  • Chapter 8 . 枚举

    阅读原文 Chapter 8 . 枚举 8.1 枚举类 主要内容: 如何自定义枚举类 如何使用enum定义枚举类 ...

  • 枚举--java24(02/17/2016)

    如何自定义枚举类如何使用enum定义枚举类、枚举类的主要方法实现接口的枚举类 JDK1.5之前需要自定义枚举类JD...

  • 探秘 Java 中的枚举(enum)

    本文包括:枚举由来如何使用?枚举类特性单例设计模式定义特殊结构枚举星期输出中文的案例枚举类API 枚举(enum)...

  • 如何优雅地在JS中使用枚举定义

    如何优雅地在JS中使用枚举 为什么使用枚举 去魔法数字 枚举语义化 定义一体化:枚举值和枚举描述写在了一起,不分散...

  • 枚举2--java25(02/18/2016)

    一、枚举类1.如何自定义枚举类2.如何使用enum关键字定义枚举类:将枚举类对象相同部分删掉,同时中间用逗号分隔。...

  • Android使用枚举正确姿态

    大家应该都知道Android建议不要用Java枚举,它占用内存很大图片 那实际开发中肯定是要用Java枚举的,那有...

  • [cpp deep dive] enum枚举类型

    如何声明一个枚举类型? 如何合法使用枚举类型? 不合法的例子? enum的值 ? enum的sizeof? 上代码...

网友评论

    本文标题:如何正确使用枚举

    本文链接:https://www.haomeiwen.com/subject/tdctlttx.html