详解枚举NS_OPTIONS与NS_ENUM的区分与格式

NS_OPTIONS

typedef NS_OPTIONS(NSUInteger, UISwipeGestureRecognizerDirection) {
    UISwipeGestureRecognizerDirectionNone = 0,  //值为0
    UISwipeGestureRecognizerDirectionRight = 1 << 0,  //值为2的0次方
    UISwipeGestureRecognizerDirectionLeft = 1 << 1,  //值为2的1次方
    UISwipeGestureRecognizerDirectionUp = 1 << 2,  //值为2的2次方
    UISwipeGestureRecognizerDirectionDown = 1 << 3  //值为2的3次方
};

小括号中第一个为NSUInteger这么些为固定值,第二个为枚举类型,自己定义,大括号中枚举项必须一切带有小括号的枚举类型,枚举项前面再跟上多少个值的区分,这里枚举项是NSUInteger类型,它的值我一度标记了,看上边注释,当然也得以像下方这样写枚举,可是官方推荐格式为地点这种。

typedef enum {
    UISwipeGestureRecognizerDirectionNone = 0,  //值为0
    UISwipeGestureRecognizerDirectionRight = 1 << 0,  //值为2的0次方
    UISwipeGestureRecognizerDirectionLeft = 1 << 1,  //值为2的1次方
    UISwipeGestureRecognizerDirectionUp = 1 << 2,  //值为2的2次方
    UISwipeGestureRecognizerDirectionDown = 1 << 3  //值为2的3次方
}UISwipeGestureRecognizerDirection;

NS_ENUM

typedef NS_ENUM(NSInteger, NSWritingDirection) {
    NSWritingDirectionNatural = -1,  //值为-1    
    NSWritingDirectionLeftToRight = 0,  //值为0
    NSWritingDirectionRightToLeft = 1  //值为1       
};

小括号中第一个为NSInteger这个为固定值,第二个为枚举类型,自己定义,大括号中枚举项必须带有小括号中温馨定义的枚举类型,枚举项自己加后缀以视区别,大括号中的枚举项的值可自定义,要是定义了枚举项其中一项的值后边依次在它的前一项的值上加1,如这样:

typedef NS_ENUM(NSInteger, NSWritingDirection) {
    NSWritingDirectionNatural = 0,  //值为0    
    NSWritingDirectionLeftToRight,  //值为1
    NSWritingDirectionRightToLeft  //值为2       
};
//或者这样
typedef NS_ENUM(NSInteger, NSWritingDirection) {
    NSWritingDirectionNatural = 0,  //值为0    
    NSWritingDirectionLeftToRight = 2,  //值为2
    NSWritingDirectionRightToLeft  //值为3       
};
//若是都不定义值,默认第一项为0,后面依次枚举项的值加1。

自然也足以下方这样写枚举,不过官方不引进,仍旧地点格式规范

typedef enum {
    NSWritingDirectionNatural = -1,  //值为-1    
    NSWritingDirectionLeftToRight = 0,  //值为0
    NSWritingDirectionRightToLeft = 1  //值为1  
}NSWritingDirection;

NS_ENUM与NS_OPTIONS区别

  • NS_ENUM枚举项的值为NSInteger,NS_OPTIONS枚举项的值为NSUInteger;

    这边怎么NS_ENUM用NSInteger,NS_OPTIONS用NSUInteger看后边总计。

  • NS_ENUM定义通用枚举,NS_OPTIONS定义位移枚举

    位移枚举即是在您需要的地点可以而且存在五个枚举值如这样:

  UISwipeGestureRecognizer *swipeGR = [[UISwipeGestureRecognizer alloc] init];
  swipeGR.direction = UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight;
  //这里几个枚举项同时存在表示它的方向同时包含1.向下2.向左3.向右

而NS_ENUM定义的枚举不能几个枚举项同时存在,只能选择其中一项,像这样:

NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
paragraph.baseWritingDirection = NSWritingDirectionNatural;
  • NS_OPTIONS的枚举项的值需要像这么表示1 << 0,1 <<
    1,2的四回方这样,而NS_ENUM可以一向给像1,2,3这样。

总结:

这边为什么会师世NS_OPTIONS与NS_ENUM且为啥不直接一个就行,且枚举值可多选。因为有个是否将代码依据C++情势编译,倘诺不依据C++情势编译,NS_OPTIONS与NS_ENUM举行形式就同样,如若要根据C++形式编译,就不同了。在行使或运算操作六个枚举值时,C++默认为运算结果的数据类型是枚举的平底数据类型即NSUInteger,且C++不同意它隐式转换为枚举类型本身,所以C++格局下定义了NS_OPTIONS宏以保证不出现类型转换。
到了这我们就清楚了一旦枚举值需要使用按位或(2个及以上枚举值可五个设有)就应用NS_OPTIONS,否则使用NS_ENUM。