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-位移枚举

枚举&位移枚举 之前,我们一般都采用C语言的方式定义枚举,这种枚举可以称为普通的枚举。 typedef enum{ DirectionTypeUp, DirectionTypeLef...
  • u014205965
  • u014205965
  • 2015年05月22日 10:09
  • 1679

iOS 定义具有位移操作的枚举的意义

经常看到系统内使用位移操作的枚举定义,一直不是很清楚其用意。今天在看SDWebImage源码的时候,在纸上稍微计算了一下,才明白其中用意。 定义枚举类型的关键字有以下几种:enum, NS_...
  • il0vech
  • il0vech
  • 2016年02月01日 13:47
  • 1488

OC中的位移枚举

想要了解位移枚举,得先熟悉位运算符。主要是两个,’ | ‘和 ‘ & ‘。和逻辑运算符’ || ‘ ‘ && ‘不同,位运算符是对二进制数字按位进行与或操作。比如2&3,就是把2和3先转换为2进制数1...
  • qq_30515765
  • qq_30515765
  • 2016年06月16日 10:05
  • 614

iOS枚举(位移枚举)

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

Swift学习笔记 - 位移枚举的按位或运算

在OC里面我们经常遇到一些枚举值可以多选的,需要用或运算来把这些枚举值链接起来,这样的我们称为位移枚举,但是在swift里面却不能这么做,下面来讲解一下如何在swift里面使用 OC的位移枚举的区分/...
  • wang631106979
  • wang631106979
  • 2016年08月30日 15:16
  • 3683

iOS 枚举位移

//联系人:石虎  QQ: 1224614774昵称:嗡嘛呢叭咪哄 一 、概念      枚举值 它是一个整形(int)  并且,它不参与内存的占用和释放,枚举定义变量即可直接使用,不用初始...
  • shihuboke
  • shihuboke
  • 2017年09月23日 12:38
  • 182

ios 枚举 位移操作

iOS 关于枚举的使用 分类: iOS 2012-09-24 14:15 6007人阅读 评论(2) 收藏 举报 ios 引言: 枚举值 它是一个整形(int)  并...
  • zhouleizhao
  • zhouleizhao
  • 2014年07月21日 10:16
  • 622

Objective-C 枚举 中位运算 的使用

前言 Enum,也就是枚举,从C语言开始就有了,C++、Java、Objective-C、Swift这些语言,当然都有对应的枚举类型,功能可能有多有少,但是最核心的还是一个—-规范的定义代码中的状态...
  • shaobo8910
  • shaobo8910
  • 2017年02月10日 19:00
  • 518

Kotlin学习(5):基本类型

Kotlin中的基本类型,主要关于数字、字符、布尔、数组和字符串。
  • IInmy
  • IInmy
  • 2017年09月12日 23:37
  • 79

在枚举中使用位移

ton #import "CZViewController.h"   typedef enum  {    CZActionTypeTop = 1 0,    CZActionTyp...
  • adadadadadadad40
  • adadadadadadad40
  • 2014年10月29日 00:53
  • 352
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS 与 位移枚举
举报原因:
原因补充:

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