详解枚举NS_OPTIONS与NS_ENUM的分及格式。SDWebImage源码阅读前的准备(二)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;

原文地址:http://www.jianshu.com/p/30f76a950604

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这么。

NSObjcRuntime.h 里面的概念:

总结:

此地为何会出现NS_OPTIONS与NS_ENUM且为什么非直一个虽行,且枚举值可多选择。因为发只是否用代码按照C++模式编译,若是不循C++模式编译,NS_OPTIONS与NS_ENUM进行方式就是相同,若是要依照C++模式编译,就差了。在运用或者运算操作简单单枚举值时,C++默看运算结果的数据类型是枚举的最底层数据列即NSUInteger,且C++不允其隐式转换为枚举类型本身,所以C++模式下定义了NS_OPTIONS宏以保证不出新类型转换。
顶了即我们不怕理解了如枚举值需要以按位或(2独与以上枚举值可基本上个设有)就使NS_OPTIONS,否则用NS_ENUM。

 1 /* NS_ENUM supports the use of one or two arguments. The first argument is always the integer type used for the values of the enum. The second argument is an optional type name for the macro. When specifying a type name, you must precede the macro with 'typedef' like so:
 2  
 3 typedef NS_ENUM(NSInteger, NSComparisonResult) {
 4     ...
 5 };
 6  
 7 If you do not specify a type name, do not use 'typedef'. For example:
 8  
 9 NS_ENUM(NSInteger) {
10     ...
11 };
12 */
13 #define NS_ENUM(...) CF_ENUM(__VA_ARGS__)
14 #define NS_OPTIONS(_type, _name) CF_OPTIONS(_type, _name)

NS_OPTIONS 实例:

表示轻扫手势的趋向:

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

  小括号中第一独为NSUInteger这个邪固定值,第二个也枚举类型,自己定义,大括号受枚举项必须不折不扣含有小括哀号的枚举类型,枚举项后面更与达到几个价的区别,这里枚举项是NSUInteger类型,它的价值我既记了,看上面注释,当然为堪像下方这样勾画枚举,但是官方推荐格式为地方那种。

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

NS_ENUM 实例:

1 /* Values for NSWritingDirection */
2 typedef NS_ENUM(NSInteger, NSWritingDirection) {
3     NSWritingDirectionNatural       = -1,    // Determines direction using the Unicode Bidi Algorithm rules P2 and P3 // 值为 -1
4     NSWritingDirectionLeftToRight   =  0,    // Left to right writing direction // 值为0
5     NSWritingDirectionRightToLeft   =  1     // Right to left writing direction // 值为1
6 } NS_ENUM_AVAILABLE_IOS(6_0);

  小括号受率先单呢NSInteger这个也固定值,第二只为枚举类型,自己定义,大括声泪俱下丁枚举项必须带有小括号丁自己定义的枚举类型,枚举项自己加后缀以盼区别,大括声泪俱下中的枚举项之值可起定义,若是定义了枚举项其中同样件之价后依次以她的前无异起的值达到加1,如这样:

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

  当然也可下方这样写枚举,但是官方不推荐,还是点格式规范:

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

NS_ENUM与NS_OPTIONS区别:

  • NS_ENUM枚举项的值为NSInteger,NS_OPTIONS枚举项的价值为NSUInteger
  • NS_ENUM定义通用枚举,NS_OPTIONS定义各队移枚举

  员移枚举即是以公待的地方可以而且设有多只枚举值如这样:

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

  而NS_ENUM定义之枚举不能够几个枚举项同时是,只能选择其中同样项,像这么:

1 NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
2 paragraph.baseWritingDirection = NSWritingDirectionNatural;
  • NS_OPTIONS的枚举项之价需要像这样表示1 << 0,1 <<
    1,2的几乎次等在这么,而NS_ENUM可以一直被诸如1,2,3这样。

  END

 

相关文章

admin

网站地图xml地图