/ iOS

读书笔记《Effective Objective-C》第5条-枚举

以前从来没有接触过enum,之前一直觉得并没有什么卵用。自从在实习的时候,公司项目中用到不少enum,才去认认真真地看了一下。确实有用,正好这本书上又专门提到了enum。就来聊聊枚举吧。

枚举是用来方便状态的表示

在一个App中,会有很多状态的概念。比如说打电话就有:正在拨号,正在通话,已挂断等等状态。那么这些状态如何表示呢?

有人这么做

#define DIALING 0
#define TALKING 1
#define DROPPED 2

这样做的缺点

没有对状态进行分类,若要分类可能需要使用注释的形式进行分类。可读性差,相当不美观。

使用enum后:

enum CallState {
    CallStateDialing,
    CallStateTalking,
    CallStateDropped,
};
typedef enum CallState CallState;

CallState state = CallStateDialing;

这种展现方式则相当舒服。当然,enum也是可以指定底层数据类型,甚至是可以选择手动给每个状态赋值:

enum CallState : NSInteger {
    CallStateDialing = 1,
    CallStateTalking,
    CallStateDropped,
}

如果是多选的状态呢?

不急,有个很巧妙的实现方式:

enum UIViewAutoresizing {
    UIViewAutoresizingNone = 0,
    UIViewAutoresizingFlexibleLeftMargin  = 1 << 0,
    UIViewAutoresizingFlexibleWidth       = 1 << 1,
    UIViewAutoresizingFlexibleRightMargin = 1 << 2,
    UIViewAutoresizingFlexibleTopMargin   = 1 << 3,
    ...
}

enum UIViewAutoresizing resizing = UIViewAutoresizingFlexibleWidth|
UIViewAutoresizingFlexibleHeight;

上面的代码用了"|"符号,是位运算中的与。再看1 << x,指的是左移x位。这二者结合起来使用,就可以达到识别具体是哪两个选项的作用了。

当然了,除去可以使用"|"以外,还可以用"+"。二者达到的效果是一样的,不过"|"要稍微快那么一点~毕竟是位运算

Foundation自带的辅助宏

就以例子的形式来讲吧,看例子了以后应该就懂了~只是比较方便使用而已~

NS_ENUM

typedef NS_ENUM(NSUInteger, UIViewAutoresizing) {
    UIViewAutoresizingFlexibleLeftMargin,
    UIViewAutoresizingFlexibleWidth,
    UIViewAutoresizingFlexibleRightMargin,
    UIViewAutoresizingFlexibleTopMargin,
}

NS_OPTION

typedef NS_OPTION(NSUInteger, UIViewAutoresizing) {
    UIViewAutoresizingFlexibleLeftMargin  = 1 << 0,
    UIViewAutoresizingFlexibleWidth       = 1 << 1,
    UIViewAutoresizingFlexibleRightMargin = 1 << 2,
    UIViewAutoresizingFlexibleTopMargin   = 1 << 3,
}