详解枚举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地图