NS_OPTIONS和NS_ENUM使用区别

1、有符号、无符号
有符号:用最高为来表示符号位 , 1表示负,0表示正无符号:全部用来表示实际数。两者的取值范围不同有符号整型为 -32768 到 32767
无符号 (unsigned):整型 为 0 到 65535

2、NSUInteger、NSInteger
NSUInteger是无符号的整型,,在表视图应用中常见 NSUInteger row= [indexPath row];因为这是显示tableViewCell有多少个,只能是非零整数的,也就是说NSUInteger常用于索引值;
NSInteger是有符号的整型

3、NS_OPTIONS、NS_ENUM
NS_ENUM 定义通用枚举 枚举项的值为NSInteger,
NS_OPTIONS 定义位移枚举 枚举项的值为NSUInteger; ps:位移枚举即是在你需要的地方可以同时存在多个枚举值

   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次方
      };

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

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

       NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
       paragraph.baseWritingDirection = NSWritingDirectionNatural; //而NS_ENUM定义的枚举不能几个枚举项同时存在,只能选择其中一项

4、 问题
问: 这里为什么会出现NS_OPTIONS与NS_ENUM且为什么不直接一个就行,且枚举值可多选
答:因为有个是否将代码按照C++模式编译,若是不按照C++模式编译,NS_OPTIONS与NS_ENUM展开方式就一样,若是要按照C++模式编译,就不同了。
在使用或运算操作两个枚举值时,C++默认为运算结果的数据类型是枚举的底层数据类型即NSUInteger,且C++不允许它隐式转换为枚举类型本身,所以C++模式 下定义了NS_OPTIONS宏以保证不出现类型转换。
到了这我们就知道了只要枚举值需要用到按位或(2个及以上枚举值可多个存在)就使用NS_OPTIONS,否则使用NS_ENUM。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。