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

如何正确使用枚举

作者: 啃手高手 | 来源:发表于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”定义,保证统一。

    参考文章

    相关文章

      网友评论

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

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