iOS 与 位移枚举

原创 2017年01月03日 22:54:26

我们一般都采用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  
};  
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

iOS枚举(位移枚举)

什么是枚举在程序设计语言中,一般用一个数值来代表某一状态,这种处理方法不直观,易读性差。如果能在程序中用自然语言中有相应含义的单词来代表某一状态,则程序就很容易阅读和理解。也就是说,事先考虑到某一变量...

iOS 与 位移枚举

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

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

iOS-位移枚举

枚举&位移枚举 之前,我们一般都采用C语言的方式定义枚举,这种枚举可以称为普通的枚举。 typedef enum{ DirectionTypeUp, DirectionTypeLef...

OC中的枚举类型

什么是位移操作枚举呢? 一直对OC中的位移操作枚举不太理解,查找到两篇介绍OC中枚举的文章,觉得很不错。

枚举中的位运算学习笔记

我们经常遇到,系统定义的枚举中,经常遇到位运算。就像下面代码块中所用到的那样(<<),位运算是怎么运算的呢?它究竟有什么作用呢?

C与Objective-C中的枚举(位移枚举)

1.在C语言 中我们用到一串有关联,被当作判断状态依据的常量时,会用到枚举Enum,其使用: enum week{ Mon, Tues, Wed, Thur...

iOS-枚举

枚举&位移枚举 之前,我们一般都采用C语言的方式定义枚举,这种枚举可以称为普通的枚举。 [objc] view plain copy typede...

iOS 枚举

枚举 基础框架的集合类 nsarray , nsdictionary , NSSet , NSIndexSet 声明方法,执行一个特定类型的枚举指定块的收集和客户提供代码来处理每个枚举项或测试。...

位运算+枚举

位运算http://c.biancheng.net/cpp/html/101.html 在很多情况下(比如翻棋子)在搜索时涉及大量枚举往往导致超时,位运算则很好地解决了这个问题,方便又快捷 ...

iOS 枚举的巧用

1.使用层面的理解 在这里首先讲如何简单的使用, 仅仅是使用层面(有理解错误的地方帮忙纠正), 然后我们在去理解位运算符! 在下面的图中我们可以看见枚举值中有(位运算符:左移): 如果...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)