欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-07 13:57:03
...

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

枚举类型: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    Effective Objective-C2.0读书小记(一)枚举

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

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

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

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

其二进制值为:Effective Objective-C2.0读书小记(一)枚举

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分支,那么它就会处理这个新状态,从而导致编译器不发警告信息。

 

转载于:https://my.oschina.net/sgcllr/blog/788490