謝公子造轮子

iOS开发-经验分享和交流

iOS 与 位移枚举

我们一般都采用C语言的方式定义枚举,这种枚举可以称为普通的枚举。

typedef enum{  
    DirectionTypeUp,  
    DirectionTypeLeft,  
    DirectionTypeDown,  
    DirectionTypeRight  
} DirectionType; 

但是我们在查看苹果的SDK或者看一些第三方库时会像下面这样定义枚举。
比如SDWebImage代码中这样定义枚举,这称为位移枚举。

typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) {  
    SDWebImageRetryFailed = 1 << 0,  
    SDWebImageLowPriority = 1 << 1,  
    SDWebImageCacheMemoryOnly = 1 << 2,  
    SDWebImageProgressiveDownload = 1 << 3,  
    SDWebImageRefreshCached = 1 << 4,  
    SDWebImageContinueInBackground = 1 << 5,  
    SDWebImageHandleCookies = 1 << 6,  
    SDWebImageAllowInvalidSSLCertificates = 1 << 7,  
    SDWebImageHighPriority = 1 << 8,  
    SDWebImageDelayPlaceholder = 1 << 9,  
    SDWebImageTransformAnimatedImage = 1 << 10,  
};  

乍一看有点懵逼, 这直接写成十进制的值不好么? 敲黑板了这里!!

“位移枚举”代表什么意思??

让我们先来回顾一下位运算符号 ( 不懂的请回去翻书 )
这里写图片描述

下面结合一个简单代码demo对“位移枚举”来做讲解。

#import "ViewController.h"  

// 因为"位运算"的计算方式是将二进制转换成十进制,也就是说,枚举值里面存取的是计算后的十进制值.  
typedef NS_OPTIONS(NSUInteger, DirectionType) {  
    DirectionTypeUp = 1 << 0,   // 十进制1  
    DirectionTypeLeft = 1 << 1, // 十进制2  
    DirectionTypeDown = 1 << 2, // 十进制4  
    DirectionTypeRight = 1 << 3,// 十进制8  
};  

@interface ViewController ()  

@end  

@implementation ViewController  

- (void)viewDidLoad {  
    [super viewDidLoad];  

    [self demoTest:DirectionTypeUp | DirectionTypeLeft | DirectionTypeRight];  
    /* 
     DirectionTypeUp    表示 0001 
     DirectionTypeLeft  表示 0010 
     DirectionTypeRight 表示 1000 

     按位或之后变成 1011 (十进制表示 11) 
     */  
}  

- (void)demoTest:(DirectionType)options{  

    /* 
     因为这里options 表示 1011 ,然后进行按位与 
     */  
    if (options & DirectionTypeUp) { // 1011 & 0001 按位与为 0001  
        NSLog(@"向上");  
    }  
    if (options & DirectionTypeLeft) { // 1011 & 0010 按位与为 0010  
        NSLog(@"向左");  
    }  
    if (options & DirectionTypeDown) { // 1011 & 0100 按位与为 0000  
        NSLog(@"向下");  
    }  
    if (options & DirectionTypeRight) { // 1011 & 1000 按位与为 1000  
        NSLog(@"向右");  
    }  

    /* 
     所以最后打印: 向上 向左 向右 
     */  
}  

@end  

有些同学对位移操作可能有些忘了: 左移(<<)操作是什么意思呢?

这里写图片描述

总而言之

其实,”位移枚举”是C语言中遗留下来的一种很古老并且好用的技术延用至今。
只需要定义一个参数,就可以通过传入不同的枚举组合,达到我们想要的值。
所以苹果在iOS6和Mac OS 10.8以后引入了两个宏NS_OPTIONSNS_ENUM来定义枚举类型,实际上是将enum定义和typedef合二为一。

NS_OPTIONS :一般用来定义位移相关操作的枚举值。
NS_ENUM: 一般用来定义普通的枚举。

NS_ENUM和NS_OPTIONS本质是一样的,仅仅从字面上来区分其用途,采用不同的宏来从代码角度来区分。

最后, 我们参考如下UIKit.Framework的头文件,可以看到苹果是如何给普通枚举和位移枚举做定义的。

typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {  
    UIViewAnimationTransitionNone,//默认从0开始  
    UIViewAnimationTransitionFlipFromLeft,  
    UIViewAnimationTransitionFlipFromRight,  
    UIViewAnimationTransitionCurlUp,  
    UIViewAnimationTransitionCurlDown,  
};  

typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {  
    UIViewAutoresizingNone                 = 0,  
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,  
    UIViewAutoresizingFlexibleWidth        = 1 << 1,  
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,  
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,  
    UIViewAutoresizingFlexibleHeight       = 1 << 4,  
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5  
};  
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013316626/article/details/53999104
个人分类: ObjectiveC iOS开发
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭