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

2018-08-02  本文已影响33人  MrSYLong

枚举是一种常量命名方式,可以被我们应用来表示状态机的状态,传递给方法的选项以及状态码等值。

// 示例
enum EOCConnectionState {
    EOConnectionStateDisConnected,
    EOConnectionStateConnecting,
    EOConnectionStateConnected,
};

// 定义枚举变量 示例
enum EOCConnectionState state = EOConnectionStateConnected;

每次定义枚举变量还需要写“enum”,不简洁。
可以使用typedef关键字重新定义枚举类型

enum EOCConnectionState {
    EOConnectionStateDisConnected,
    EOConnectionStateConnecting,
    EOConnectionStateConnected,
};
typedef enum EOCConnectionState EOCConnectionState;

// 定义枚举变量 示例
EOCConnectionState state = EOConnectionStateConnected;

上面的枚举示例,编译器会为枚举分配一个独有的编号,从0开始,每个枚举递增1。实现枚举所用的数据类型取决于编译器。

// 自己指定底层数据类型,不使用编译器所分配的序号 示例
enum EOCConnectionStateConnectionState : NSInteger {
    EOConnectionStateDisConnected = 1,
    EOConnectionStateConnecting,
    EOConnectionStateConnected,
};

typedef enum EOCConnectionStateConnectionState EOCConnectionStateConnectionState;

// 定义枚举变量
EOCConnectionStateConnectionState state = EOConnectionStateConnected;

说明:
代码中“enum EOCConnectionStateConnectionState : NSInteger”指定了底层数据类型是NSInteger。
把EOConnectionStateDisConnected的值设为1,而不使用编译器所分配的0,所以接下来几个枚举的值都会在上一个的基础上递增1。

枚举定义选项的时候,选项还可以彼此组合,各选项之间可通过“按位或操作符”来组合。

// 要进行按位或操作符的枚举 示例
enum UIViewAutoresizingEnum {
    UIViewAutoresizingSNone                 = 0,
    UIViewAutoresizingSFlexibleLeftMargin   = 1 << 0,
    UIViewAutoresizingSFlexibleWidth        = 1 << 1,
    UIViewAutoresizingSFlexibleRightMargin  = 1 << 2,
    UIViewAutoresizingSFlexibleTopMargin    = 1 << 3,
    UIViewAutoresizingSFlexibleHeight       = 1 << 4,
    UIViewAutoresizingSFlexibleBottomMargin = 1 << 5
};
typedef enum UIViewAutoresizingEnum UIViewAutoresizingEnum;

// 定义枚举变量
UIViewAutoresizingEnum resize = UIViewAutoresizingSFlexibleWidth | UIViewAutoresizingSFlexibleHeight;

Foundation框架中定义了一些辅助的宏,用这宏来定义枚举类型时,也可以指定保存枚举值的底层数据类型。

typedef NS_ENUM(NSUInteger, EOConnectionState)
{
    EOConnectionStateDisConnected,
    EOConnectionStateConnecting,
    EOConnectionStateConnected,
};


typedef NS_OPTIONS(NSUInteger, EOCPermittedDirection)
{
    EOCPermittedDirectionUp    = 1 << 0,
    EOCPermittedDirectionDown  = 1 << 1,
    EOCPermittedDirectionLeft  = 1 << 2,
    EOCPermittedDirectionRight = 1 << 3,
};

说明:
需要以按位或操作来组合的枚举,应使用NS_OPTIONS定义。
不需要相互组合,应使用NS_ENUM来定义。

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

EOConnectionState state = EOConnectionStateConnecting;
switch (state) {
    case EOConnectionStateDisConnected:
        
        break;
    case EOConnectionStateConnecting:
        
        break;
    case EOConnectionStateConnected:
        
        break;
}
上一篇下一篇

猜你喜欢

热点阅读