iOS开发 - 关于枚举

枚举在开发中作用很大,多用来表示状态,选项,状态码。我们知道Object-C是基于C的,所以C的功能它都有,枚举类型就是其中的一个,枚举是一种常量命名方式,一个对象所经历的各种状态可以定义为一个枚举集。比如表示一天中吃饭的状态:

enum EatSomething {
    EatBreakfast,
    EatLunch,
    EatDinner,
};

但是这么写在代码中定义枚举的方式却不是很简洁:

enum EatSonmething eatState = EatLunch;

为了简化定义步骤,去掉enum,需要在定义枚举时多加一步,使用typedef关键字重新定义枚举类型:

enum EatSomething {
    EatBreakfast,
    EatLunch,
    EatDinner,
};
typedef enum EatSomething EatSonmething;

接下来就可以方便的定义枚举类型了:

EatSonmething eatState = EatLunch;

每一个状态都用一个便于理解的值表示,使得代码更易读。而且编辑器会自动为每一个状态分配编号,从0开始依次递增1。如果想要改变序号:

enum EatSomething {
    EatBreakfast = 2,
    EatLunch,
    EatDinner,
};
/*第一项从2开始,后面依次递增1,为3,4*/

C++11修订了枚举的某些特征。其中一项就是:可以指明用何种“底层数据类型”来保存枚举类型的变量,这使得枚举类型可以向前声明,否则我们无从得知枚举的类型,也无法知道其数据类型大小并分配空间。若要指明其所用类型:

enum EatSomething : NSInteger{
/**/
};

有时候,我们在水平或垂直方向上调整视图大小时,会遇到几个枚举类型通过“按位或操作符”组合使用的场景:

typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
    UIViewAutoresizingNone                 = 0,
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
    UIViewAutoresizingFlexibleWidth        = 1 << 1,
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
    UIViewAutoresizingFlexibleHeight       = 1 << 4,
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};

从第二个开始依次是2的整数幂,由0开始,他们之间可以按照需要进行组合,比如要判断是否启用某个选项:

UIViewAutoresizing resizing = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

if(resizing & UIViewAutoresizingFlexibleWidth){
    //UIViewAutoresizingFlexibleWidth is set
}

系统框架中频繁使用这个方法,在UI框架的UIKit中还有一个支持设备显示方向的枚举类型叫UIInterfaceOrientationMask,需要实现一个名为supportedInterfaceOrientations的方法,将所要支持的显示方向告诉系统:

// 支持的屏幕方向,这个方法返回 UIInterfaceOrientationMask 类型的值。
- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft;
}

在这里你会发现上面博主定义的枚举类型有不一样了:

enum 名字{
}
.
.
.
typedef NS_OPTIONS(类型, 名字){
}

在Foundation框架中定义了一些辅助的宏,用这些宏来定义枚举类型时,可指定用于保存枚举值的底层数据类型,它具有向后兼容的能力,如果目标平台的编辑器支持新标准,那就用新式语法,否则使用旧式语法。这些宏是用#define预处理指令来定义的,若要定义一个吃饭状态的枚举类型和一个类似UIViewAutoresizing这样包含一系列选项的枚举类型:

typedef NS_ENUM(NSUInteger, EatSomething) {
    EatBreakfast,
    EatLunch,
    EatDinner,
};

typedef NS_OPTIONS(NSUInteger, LHHViewDirection) {
    LHHViewUp     =1 << 0,
    LHHViewDown   =1 << 1,
    LHHViewLeft   =1 << 2,
    LHHViewRight  =1 << 3,
};

以上可知,若是定义的枚举可进行按位或组合,需要用NS_OPTIONS来定义,否则需用NS_ENUM来定义。

最后,在使用枚举时有一点要注意,特别是在switch中,我们总习惯加上一个default分支。但是若要用枚举的话最好不要加default分支,这样做,当新加入一个状态时编辑器会发出警告,提示新加入的状态未在switch分支中做处理,如果加上default分支,他就会来处理这个新的状态,编辑器不发出警告。在使用枚举时尤其要注意这点,通常要确保switch语句可以处理所有的样式。

你可能感兴趣的:(iOS日常开发)