iOS-枚举

枚举&位移枚举

之前,我们一般都采用C语言的方式定义枚举,这种枚举可以称为普通的枚举。
[objc]  view plain  copy
  1. typedef enum{  
  2.     DirectionTypeUp,  
  3.     DirectionTypeLeft,  
  4.     DirectionTypeDown,  
  5.     DirectionTypeRight  
  6. } DirectionType;  

但是我们在查看苹果的SDK或者看一些第三方库时会像下面这样定义枚举。比如SDWebImage代码中这样定义枚举,这称为位移枚举。
[objc]  view plain  copy
  1. typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) {  
  2.     SDWebImageRetryFailed = 1 << 0,  
  3.     SDWebImageLowPriority = 1 << 1,  
  4.     SDWebImageCacheMemoryOnly = 1 << 2,  
  5.     SDWebImageProgressiveDownload = 1 << 3,  
  6.     SDWebImageRefreshCached = 1 << 4,  
  7.     SDWebImageContinueInBackground = 1 << 5,  
  8.     SDWebImageHandleCookies = 1 << 6,  
  9.     SDWebImageAllowInvalidSSLCertificates = 1 << 7,  
  10.     SDWebImageHighPriority = 1 << 8,  
  11.     SDWebImageDelayPlaceholder = 1 << 9,  
  12.     SDWebImageTransformAnimatedImage = 1 << 10,  
  13. };  
  这种“位移枚举”是代表什么意思那?? 先回顾一下位运算符号(具体细节请百度)


下面我结合实际应用,说明一下“位移枚举”。
[objc]  view plain  copy
  1. #import "ViewController.h"  
  2.   
  3. // 因为"位运算"的计算方式是将二进制转换成十进制,也就是说,枚举值里面存取的是计算后的十进制值.  
  4. typedef NS_OPTIONS(NSUInteger, DirectionType) {  
  5.     DirectionTypeUp = 1 << 0,   // 十进制1  
  6.     DirectionTypeLeft = 1 << 1// 十进制2  
  7.     DirectionTypeDown = 1 << 2// 十进制4  
  8.     DirectionTypeRight = 1 << 3,// 十进制8  
  9. };  
  10.   
  11. @interface ViewController ()  
  12.   
  13. @end  
  14.   
  15. @implementation ViewController  
  16.   
  17. - (void)viewDidLoad {  
  18.     [super viewDidLoad];  
  19.       
  20.     [self demoTest:DirectionTypeUp | DirectionTypeLeft | DirectionTypeRight];  
  21.     /* 
  22.      DirectionTypeUp    表示 0001 
  23.      DirectionTypeLeft  表示 0010 
  24.      DirectionTypeRight 表示 1000 
  25.       
  26.      按位或之后变成 1011 (十进制表示 11) 
  27.      */  
  28. }  
  29.   
  30. - (void)demoTest:(DirectionType)options{  
  31.       
  32.     /* 
  33.      因为这里options 表示 1011 ,然后进行按位与 
  34.      */  
  35.     if (options & DirectionTypeUp) { // 1011 & 0001 按位与为 0001  
  36.         NSLog(@"向上");  
  37.     }  
  38.     if (options & DirectionTypeLeft) { // 1011 & 0010 按位与为 0010  
  39.         NSLog(@"向左");  
  40.     }  
  41.     if (options & DirectionTypeDown) { // 1011 & 0100 按位与为 0000  
  42.         NSLog(@"向下");  
  43.     }  
  44.     if (options & DirectionTypeRight) { // 1011 & 1000 按位与为 1000  
  45.         NSLog(@"向右");  
  46.     }  
  47.       
  48.     /* 
  49.      所以最后打印: 向上 向左 向右 
  50.      */  
  51. }  
  52.   
  53. @end  




其实,"位移枚举"是C语言中遗留下来的一种很古老并且好用的技术延用至今。只需要定义一个参数,就可以通过传入不同的枚举组合,达到我们想要的效果。所以苹果在iOS6和Mac OS 10.8以后引入了两个宏NS_OPTIONS 和NS_ENUM来定义枚举类型,实际上是将enum定义和typedef合二为一,NS_ENUM和NS_OPTIONS本质是一样的,仅仅从字面上来区分其用途,采用不同的宏来从代码角度来区分我们可以参考UIKit.Framework的头文件,可以看到大量的枚举定义。

NS_OPTIONS :一般用来定义位移相关操作的枚举值。
NS_ENUM: 一般用来定义普通的枚举。
[objc]  view plain  copy
  1. typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {  
  2.     UIViewAnimationTransitionNone,//默认从0开始  
  3.     UIViewAnimationTransitionFlipFromLeft,  
  4.     UIViewAnimationTransitionFlipFromRight,  
  5.     UIViewAnimationTransitionCurlUp,  
  6.     UIViewAnimationTransitionCurlDown,  
  7. };  
  8.   
  9. typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {  
  10.     UIViewAutoresizingNone                 = 0,  
  11.     UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,  
  12.     UIViewAutoresizingFlexibleWidth        = 1 << 1,  
  13.     UIViewAutoresizingFlexibleRightMargin  = 1 << 2,  
  14.     UIViewAutoresizingFlexibleTopMargin    = 1 << 3,  
  15.     UIViewAutoresizingFlexibleHeight       = 1 << 4,  
  16.     UIViewAutoresizingFlexibleBottomMargin = 1 << 5  
  17. };  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值