Effective Objective-C2.0读书小记(一)枚举

*爱你&永不变心* 提交于 2020-04-07 11:37:40

第五条:用枚举表示状态、选项、状态码

枚举类型:enum

①枚举是一种常量命名方式。比如说:

 enum EOCButtonType {
        EOCButtonTypeCustom,
        EOCButtonTypeSystem,
        EOCButtonTypeDetailDisclosure,
    };

编译器会为枚举分配一个独有的编号,从0开始,每个枚举递增+1。

当然,也可以不使用编译器分配的序号

 enum EOCButtonType {
       EOCButtonTypeCustom=1,
       EOCButtonTypeSystem,
       EOCButtonTypeDetailDisclosure,
    };

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

定义枚举的方式:

enum EOCButtonType type =UIButtonTypeDetailDisclosure;

用typedef关键字重新定义:(这样就不用每次定义时敲入enum而只需要写EOCButtonType了)

typedef enum EOCButtonType EOCButtonType;
EOCButtonType state =EOCButtonTypeDetailDisclosure;

指定底层数据类型:(若不指定底层数据类型,则无法向前声明枚举类型)

enum EOCButtonType:NSInteger{/*...*/};

向前声明时指定底层数据类型

enum EOCButtonType:NSInteger;

② 定义选项时,应该使用枚举类型,若选项之间可以(通过按位或操作符)彼此组合,则更应如此。

 enum EOCButtonState {
        EOCControlStateNormal       = 0,
        EOCControlStateHighlighted  = 1 << 0,
        EOCControlStateDisabled     = 1 << 1,
        EOCControlStateSelected     = 1 << 2,
        EOCControlStateFocused      = 1 << 3,
    };

可以通过按位或操作符如下定义:

 enum EOCButtonState state= EOCControlStateHighlighted|
                               EOCControlStateSelected;
      
if(state&EOCControlStateNormal){
 //此判读没有任何意义,只是为了说明可以如此使用
}

每个枚举值所对应的二进制表示中,只有一个二进制位的值是1。如下:

EOCControlStateHighlighted   

EOCControlStateDisabled       

EOCControlStateSelected        

EOCControlStateFocused        

用按位或操作符可组合多选项,例如:EOCControlStateHighlighted | EOCControlStateSelected  

其二进制值为:

Foundation框架中定义了一些辅助的宏。

NS_ENUM(枚举不需要互相组合)

typedef NS_ENUM(NSInteger, UIControlContentVerticalAlignment) {
    UIControlContentVerticalAlignmentCenter  = 0,
    UIControlContentVerticalAlignmentTop     ,
    UIControlContentVerticalAlignmentBottom  ,
    UIControlContentVerticalAlignmentFill    ,
};

NS_OPTIONS(需要按位或操作来组合的枚举)

typedef NS_OPTIONS(NSUInteger, UIControlState) {
    UIControlStateNormal       = 0,
    UIControlStateHighlighted  = 1 << 0,                
    UIControlStateDisabled     = 1 << 1,
    UIControlStateSelected     = 1 << 2,                  
    UIControlStateFocused      = 1 << 3, 
};

这些宏可以指定用于保存枚举值的底层数据类型,具备向后兼容能力(如果目标平台的编译器支持新标准,那就使用新式语法,否则改用旧式语法)

③在switch语句中,枚举的使用

switch (_buttonType) {
        case UIButtonTypeCustom:
            //执行代码
            break;
        case UIButtonTypeSystem:
            //执行代码
            break;
        case UIButtonTypeDetailDisclosure:
            //执行代码
            break;
    }

在switch语句中最好不要有default分支。这样的话,如果之后又新增一种状态,那么编译器就会发出警告信息,提示新加入的状态并未在switch分支中处理。假如写上了default分支,那么它就会处理这个新状态,从而导致编译器不发警告信息。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!