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开发中的性能优化(下)

续 性能优化(中)— 高级(这些建议只应该在你确信他们可以解决问题和得心应手的情况下采用)1.加速启动时间快速打开app是很重要的,特别是用户第一次打开它时,对app来讲,第一印象太太太重要了。你能做...

【iOS开发】深入理解Tagged Pointer

前言在2013年9月,苹果推出了iPhone5s,与此同时,iPhone5s配备了首个采用64位架构的A7双核处理器,为了节省内存和提高执行效率,苹果提出了Tagged Pointer的概念。对于64...

iOS-位移枚举

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

iOS枚举(位移枚举)

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

iOS:枚举enum,NS_ENUM,NS_OPTIONS 定义和 位运算应用

--参考文章:http://blog.csdn.net/annkie/article/details/9877643 ==定义------------
  • houseq
  • houseq
  • 2014年05月15日 11:49
  • 2815

[iOS]详解枚举NS_ENUM与NS_OPTIONS的区别与说明

NS_ENUM与NS_OPTIONS区别说明,我们根据两种定义常见的使用场景来说明其区别。...

黑马程序员--ios基础--c语言--结构体、枚举

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------  一.结构体的定义及简单使用 数组:职能由多个相同类型的数据构成结构体:可以由多个不...
  • yuanptt
  • yuanptt
  • 2015年05月17日 21:45
  • 259

IOS中的Swift基础04(字典,枚举)

// //  main.swift //  SwiftLesson04 // //  Created by lanou on 16/10/26. //  Copyright (c) 2016...
  • ZGAaron
  • ZGAaron
  • 2016年10月26日 14:46
  • 154

IOS第十一天——Obj-C中的快速枚举

最近白天在公司的时候一堆事儿,搞的很头大,只有晚上回家有时间看书学习了,所以趁着有空就多学点儿,那么接下来就学习下Obj-C中的快速枚举,快速枚举是Obj-C的一个特性,可以让开发人员很容易地枚举容器...

iOS 枚举使用

引言: 枚举值 它是一个整形(int)  并且,它不参与内存的占用和释放,枚举定义变量即可直接使用,不用初始化. 在代码中使用枚举的目的只有一个,那就是增加代码的可读性. ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS 与 位移枚举
举报原因:
原因补充:

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