第一章 熟悉Objective-C—第5条:用枚举表示状态、选项、状态码

由于Objective-C基于C语言,所以C语言有的功能它都有。其中之一就是枚举类型:enum。系统框架中频繁用到此类型,然而开发者容易忽视它。在以一系列常量来表示错误状态码或可组合的选项时,极宜使用枚举为其命名。由于C++11标准扩充了枚举的特性,所以最新版系统框架使用了"强类型"(strong type)的枚举。没错,Objective-C也能得益于C++11标准。
枚举只是一种常量命名方式。某个对象所经历的各种状态就可以定义为一个简单的枚举集(enmueration set)。比如说,可以用下列枚举表示"套接字连接"(socket connection)的状态:

enum EOCConnectionState {
        EOCConnectionStateDisconnected,
        EOCConnectionStateConnecting,
        EOCConnectionStateConnected,
};

由于每种状态都用一个便于理解的值来表示,所以这样写出来的代码更易读懂。编译器会为枚举分配一个独有的编号,从0开始,每个枚举递增1.实现枚举所用的数据类型取决于编译器,不过其二进制位(bit)的个数必须能完全表示下枚举编号才行。在前例中,由于最大编号是2,所以使用1个字节的char类型即可。
然而定义枚举变量的方式却不太简洁,要依如下语法编写:

emu EOCConnectionState state = EOCConnectionStateDisconnected;

若是每次不用敲入enum而只需要写EOCConnectionState就好了。要想这样做则需使用typedef关键字重新定义枚举类型:

enum EOCConnectionState {
        EOCConnectionStateDisconnected,
        EOCConnectionStateConnecting,
        EOCConnectionStateConnected,
};
typedef enum EOCConnectionState EOCConnectionState;

现在可以用简写的EOCConnectionState来代替完整的enum EOCConnectionState了;

EOCConnectionState state = EOCConnectionStateDisconnected;

还可以不使用编译器所分配的序号,而是手工指定某个枚举成员所对应的值。语法如下:

enum EOCConnectionState {
        EOCConnectionStateDisconnected = 1,
        EOCConnectionStateConnecting,
        EOCConnectionStateConnected,
};

上述代码把EOCConnectionStateDisconnected的值设为1,而不使用编译器所分配的0.如前所述,接下来几个枚举的值都会在上一个基础上递增1.如果说EOCConnectionStateConnected的值就是3。
还有一种情况应该使用枚举类型,那就是定义选项的时候。若这些选项可以彼此组合,则更应如此。只要枚举定义的对,各选项之间就可通过"按位或操作符"(bitwise OR operator)来组合。

在处理枚举类型的switch语句中不要实现default分支。这样的话,加入新枚举之后,编译器就会提示开发者:switch语句并未处理所有枚举。

你可能感兴趣的:(第一章 熟悉Objective-C—第5条:用枚举表示状态、选项、状态码)