枚举enum、NS_ENUM 、NS_OPTIONS

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

enum

 

了解位移枚举之前,我们先回顾一下C语言位运算符。

1     << : 左移,比如1<<n,表示1往左移n位,即数值大小2的n次方; 例如 : 0b0001 << 1 变为了 0b0010

2     >> : 右移,类似左移,数值大小除以2的n次方
3     &  : 按位与,1与任意数等于任意数本身,0与任意数等于0,即1&x=x,0&x=0
4     |  : 按位或,x|y中只要有一个1则结果为1;反之为0
5     ^  : 按位异或,x^y相等则为0,不等则为1

 

 

typedef enum A {
    a = 0,
    b,
    c,
    d,
} englishWord;

typedef enum {
    e = 4,
    f,
    g,
} englishWord2;

englishWord eg1 = a;
englishWord2 eg2 = e;

// enum newNum:NSInteger枚举变量,并且继承NSInteger;englishWord3 枚举的别名
typedef enum newNum:NSInteger englishWord3;
enum newNum:NSInteger {
    new1 = 10,
    new2,
};
englishWord3 eg3 = new1;

eg1 = 0,eg2 = 4, eg3 = 10

 

2、NS_ENUM 、NS_OPTIONS

OC中常见的枚举,例如常见的:

typedef NS_ENUM(NSInteger, UIViewAnimationCurve) {

UIViewAnimationCurveEaseInOut,         // slow at beginning and end

UIViewAnimationCurveEaseIn,            // slow at beginning

UIViewAnimationCurveEaseOut,           // slow at end

UIViewAnimationCurveLinear

};

typedef NS_OPTIONS(NSUInteger, UIViewAnimationOptions) {

UIViewAnimationOptionLayoutSubviews            = 1 <<  0,

UIViewAnimationOptionAllowUserInteraction      = 1 <<  1, // turn on user interaction while animating

UIViewAnimationOptionBeginFromCurrentState     = 1 <<  2, // start all views from current value, not initial value

UIViewAnimationOptionRepeat                    = 1 <<  3, // repeat animation indefinitely

UIViewAnimationOptionAutoreverse               = 1 <<  4, // if repeat, run animation back and forth

UIViewAnimationOptionOverrideInheritedDuration = 1 <<  5, // ignore nested duration

UIViewAnimationOptionOverrideInheritedCurve    = 1 <<  6, // ignore nested curve

UIViewAnimationOptionAllowAnimatedContent      = 1 <<  7, // animate contents (applies to transitions only)

UIViewAnimationOptionShowHideTransitionViews   = 1 <<  8, // flip to/from hidden state instead of adding/removing

UIViewAnimationOptionOverrideInheritedOptions  = 1 <<  9, // do not inherit any options or animation type

UIViewAnimationOptionCurveEaseInOut            = 0 << 16, // default

UIViewAnimationOptionCurveEaseIn               = 1 << 16,

UIViewAnimationOptionCurveEaseOut              = 2 << 16,

UIViewAnimationOptionCurveLinear               = 3 << 16,

UIViewAnimationOptionTransitionNone            = 0 << 20, // default

UIViewAnimationOptionTransitionFlipFromLeft    = 1 << 20,

UIViewAnimationOptionTransitionFlipFromRight   = 2 << 20,

UIViewAnimationOptionTransitionCurlUp          = 3 << 20,

UIViewAnimationOptionTransitionCurlDown        = 4 << 20,

UIViewAnimationOptionTransitionCrossDissolve   = 5 << 20,

UIViewAnimationOptionTransitionFlipFromTop     = 6 << 20,

UIViewAnimationOptionTransitionFlipFromBottom  = 7 << 20,

} NS_ENUM_AVAILABLE_IOS(4_0);

 

这两个宏的定义在Foundation.framework的NSObjCRuntime.h中:

#if (__cplusplus && __cplusplus >= 201103L && (__has_extension(cxx_strong_enums) || __has_feature(objc_fixed_enum))) || (!__cplusplus && __has_feature(objc_fixed_enum))

#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type

#if (__cplusplus)

#define NS_OPTIONS(_type, _name) _type _name; enum : _type

#else

#define NS_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type

#endif

#else

#define NS_ENUM(_type, _name) _type _name; enum

#define NS_OPTIONS(_type, _name) _type _name; enum

#endif

 

 

typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {

展开得到:

  1. typedef enum UIViewAnimationTransition : NSInteger UIViewAnimationTransition;  
  2. enum UIViewAnimationTransition : NSInteger {

 

其实从枚举定义来看,NS_ENUM和NS_OPTIONS本质是一样的,仅仅从字面上来区分其用途。NS_ENUM是通用情况,NS_OPTIONS一般用来定义具有位移操作或特点的情况(bitmask)。

 

开发中,你也许见到过或用过类似这种的枚举类型:

typedef NS_OPTIONS(NSUInteger, BDRequestOptions) {

    BDRequestOptionSuccess     1 << 0,
    BDRequestOptionFailure     
1 << 1,
    BDRequestOptionProcessing 
1 << 2,
    BDRequestOptionAnimate     
1 << 3,
};

其实这种的并不是枚举,而是按位掩码(bitmask),他的语法和枚举相同。但用法却不同。

示例:

// 首先定义一组
typedef NS_OPTIONS(NSUInteger, BDRequestOptions) {BDRequestOptionSuccess     = 1 << 0,BDRequestOptionFailure     = 1 << 1,BDRequestOptionProcessing  = 1 << 2,BDRequestOptionAnimate     = 1 << 3,
};// 然后调用我们定义的方法
#pragma mark - View lifeCycle
- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor orangeColor];[self test:BDRequestOptionSuccess | BDRequestOptionFailure | BDRequestOptionProcessing | BDRequestOptionAnimate];
}- (void)test:(BDRequestOptions)type {if (type & BDRequestOptionSuccess) {NSLog(@"BDRequestOptionSuccess");}if (type & BDRequestOptionFailure) {NSLog(@"BDRequestOptionFailure");}if (type & BDRequestOptionProcessing) {NSLog(@"BDRequestOptionProcessing");}if (type & BDRequestOptionAnimate) {NSLog(@"BDRequestOptionAnimate");}
}// 查看打印结果:
2016-04-04 14:09:44.946 OC测试[5869:719056] BDRequestOptionSuccess
2016-04-04 14:09:44.947 OC测试[5869:719056] BDRequestOptionFailure
2016-04-04 14:09:44.947 OC测试[5869:719056] BDRequestOptionProcessing
2016-04-04 14:09:44.947 OC测试[5869:719056] BDRequestOptionAnimate

分析:

// 首先定义一组
typedef NS_OPTIONS(NSUInteger, BDRequestOptions) {BDRequestOptionSuccess     = 0b0001 << 0,BDRequestOptionFailure     = 0b0010 << 1,BDRequestOptionProcessing  = 0b0100 << 2,BDRequestOptionAnimate     = 0b1000 << 3,
};#pragma mark - View lifeCycle
- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor orangeColor];[self test:BDRequestOptionSuccess | BDRequestOptionFailure | BDRequestOptionProcessing | BDRequestOptionAnimate];/** BDRequestOptionSuccess | BDRequestOptionFailure | BDRequestOptionProcessing | BDRequestOptionAnimate等同于:0b0001 |0b0010 |0b0100 |0b1000 结果为:0b1111*/
}- (void)test:(BDRequestOptions)type {// 0b1111 & 0b0001 --->  0b0b0001if (type & BDRequestOptionSuccess) {NSLog(@"BDRequestOptionSuccess");}// 0b1111 & 0b0010 --->  0b0b0010if (type & BDRequestOptionFailure) {NSLog(@"BDRequestOptionFailure");}// 0b1111 & 0b0100 --->  0b0b0100if (type & BDRequestOptionProcessing) {NSLog(@"BDRequestOptionProcessing");}// 0b1111 & 0b1000 --->  0b0b1000if (type & BDRequestOptionAnimate) {NSLog(@"BDRequestOptionAnimate");}
}

 

另,默认的,如果开发中枚举值传0,意味着不做任何操作。

例如:

// 传0,不打印任何值
[self test:0];

 

 

OC中的用法:

NSString *string = @"Learning";[string boundingRectWithSize:CGSizeMake(CGRectGetWidth(self.view.frame), MAXFLOAT)options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingTruncatesLastVisibleLineattributes:@{NSFontAttributeName : [UIFont systemFontOfSize:12.f]}context:nil];

上面传值:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingTruncatesLastVisibleLine

逻辑处理:

 1     // 对传入的option逻辑处理
 2     if (option & NSStringDrawingUsesLineFragmentOrigin) {
 3         // 包含   NSStringDrawingUsesLineFragmentOrigin
 4     } else {
 5         // 未包含 NSStringDrawingUsesLineFragmentOrigin
 6     }
 7     if (option & NSStringDrawingTruncatesLastVisibleLine) {
 8         // 包含   NSStringDrawingTruncatesLastVisibleLine
 9     } else {
10         // 未包含 NSStringDrawingTruncatesLastVisibleLine
11     }

 

对于位移枚举的具体使用方法,建议可以查看一些三方库,例如SDWebImage等!

转载于:https://my.oschina.net/u/2320280/blog/729447

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458169.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字图像处理-频率域滤波原理

from&#xff1a;https://blog.csdn.net/forrest02/article/details/55510711?locationNum15&fps1 写在前面的话 作者是一名在读的硕士研究僧&#xff0c;方向是图像处理。由于图像处理是一门相对复杂的学科&#xff0c;作者在课堂上学到的东西只是非常浅显的内容&#…

深入浅出的讲解傅里叶变换(真正的通俗易懂)

原文出处&#xff1a; 韩昊 1 2 3 4 5 6 7 8 9 10 作 者&#xff1a;韩 昊 知 乎&#xff1a;Heinrich 微 博&#xff1a;花生油工人 知乎专栏&#xff1a;与时间无关的故事 谨以此文献给大连海事大学的吴楠老师&#xff0c;柳晓鸣老师&#xff0c;王新年老师以及张晶泊老…

IIS(1)

转载&#xff1a;http://blog.csdn.net/ce123 IIS音频总线学习&#xff08;一&#xff09;数字音频技术 一、声音的基本概念 声音是通过一定介质传播的连续的波。 图1 声波重要指标&#xff1a; 振幅&#xff1a;音量的大小周期&#xff1a;重复出现的时间间隔频率&#xff1a;…

手机屏幕适配原理及实现

为什么80%的码农都做不了架构师&#xff1f;>>> 手机屏幕是用户与 App 最直接的交互点 不同的分辨率下用户对我们的 App 具有明显的感观差异&#xff0c;主流分辨率的更新迭代却又完全独立于 App 进行。这让我们想要使 App 在绝大多数主流手机上都保持感观、体验的…

【数字图像处理】傅里叶变换在图像处理中的应用

from&#xff1a;https://www.cnblogs.com/tenderwx/p/5245859.html 1.理解二维傅里叶变换的定义 1.1二维傅里叶变换 二维Fourier变换: 逆变换&#xff1a; 1.2二维离散傅里叶变换 一个图像尺寸为MN的 函数的离散傅里叶变换由以下等式给出&#xff1a; 其中 和。其中变量u和…

求二叉树中两个节点的最远距离

问题定义如果我们把二叉树看成一个图&#xff0c;父子节点之间的连线看成是双向的&#xff0c;我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。计算一个二叉树的最大距离有两个情况:情况A: 路径经过左子树的最深节…

Source Insight 4.0 最简单的破解安装

from&#xff1a;https://blog.csdn.net/biubiuibiu/article/details/78044232 三步完成Source Insight 4.0 破解安装 下载地址有更新&#xff0c;之前有朋友因潜在的版权问题封禁没下到&#xff0c;现在更新后可正常使用了。 文末有完全清除上次安装残留的方法&#xff0c;…

XML——XML介绍和基本语法

from&#xff1a;https://blog.csdn.net/gavin_john/article/details/51511180 1.XML历史 gml(1969)->sgml(1985)->html(1993)->xml(1998) 1969 gml(通用标记语言)&#xff0c;主要目的是要在不同的机器之间进行通信的数据规范1985 sgml(标准通用标记语言)1993 htm…

Tomcat7.0安装配置

很久没有通过博客对学习所得进行记录了。 现在将使用Tomcat的一些经验和心得写到这里&#xff0c;作为记录和备忘。如果有朋友看到&#xff0c;也请不吝赐教。 首先&#xff0c;我个人使用的是apache-tomcat-7.0.27你可以下载使用&#xff0c;前提条件你需要安装JDK1.6或者1.7都…

TIFF图像文件格式详解

from&#xff1a;https://www.cnblogs.com/gywei/p/3393816.html 1 什么是TIFF&#xff1f; TIFF是Tagged Image File Format的缩写。在现在的标准中&#xff0c;只有TIFF存在&#xff0c; 其他的提法已经舍弃不用了。做为一种标记语言&#xff0c;TIFF与其他文件格式最大的不…

图像处理之积分图应用三(基于NCC快速相似度匹配算法)

from&#xff1a;https://blog.csdn.net/jia20003/article/details/53021614 图像处理之积分图应用三&#xff08;基于NCC快速相似度匹配算法&#xff09; 基于Normalized cross correlation(NCC)用来比较两幅图像的相似程度已经是一个常见的图像处理手段。在工业生产环节检测…

深入浅出地理解机器人手眼标定

from&#xff1a;https://blog.csdn.net/qq_16481211/article/details/79764730 所谓手眼系统&#xff0c;就是人眼镜看到一个东西的时候要让手去抓取&#xff0c;就需要大脑知道眼镜和手的坐标关系。如果把大脑比作B&#xff0c;把眼睛比作A&#xff0c;把手比作C,如果A和B的…

centos 6.5 安装 mongodb

官方给出的链接地址&#xff1a;https://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat/ 安装后重要的日志 win10 上使用mongochef连接不上数据库 解决方案&#xff1a; 修改 /etc/mongod.conf 将bindIP 改为0.0.0.0 监听外网转载于:https://www.cnblogs.com/l…

opencv3/C++ 机器学习-SVM应用实例:药品(胶囊)识别与分类

from&#xff1a;https://blog.csdn.net/akadiao/article/details/79278072 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/akadiao/article/details/79278072 问题描述&#xff1a; 现对6种不同颜色药品&#xff08;胶囊…

linux命令学习-1-less

less 工具也是对文件或其它输出进行分页显示的工具&#xff0c;应该说是linux正统查看文件内容的工具&#xff0c;功能极其强大。less 的用法比起 more 更加的有弹性。在 more 的时候&#xff0c;我们并没有办法向前面翻&#xff0c; 只能往后面看&#xff0c;但若使用了 less …

jspspy database help

.转载于:https://www.cnblogs.com/outline/p/5316051.html

SVM 调参策略

转自&#xff1a;SVM 调参策略&#xff1a;https://blog.csdn.net/u014484783/article/details/78220646 SVM 怎样能得到好的结果 1. 对数据做归一化&#xff08;simple scaling&#xff09; 2. 应用 RBF kernel 3. 用cross-validation和grid-search 得到最优的c和g 4. 用…

美好的⼀天 从ActionTab开始 美观、智能、⾼效的新标签⻚ iTab 新标签页iTab新标签页Atop100工具推荐

文章目录 ActionTabiTab 新标签页iTab新标签页&#xff0c;小组件&#xff0c;起始页&#xff0c;标签页&#xff0c;日历&#xff0c;股票&#xff0c;浏览器扩展 https://www.actiontab.cn/ ActionTab 收费&#xff1f;&#xff1f;&#xff1f;&#xff1f; iTab 新标签页iT…

机器学习中的算法(2)-支持向量机(SVM)基础

from:http://www.cnblogs.com/LeftNotEasy/archive/2011/05/18/2034566.html 版权声明&#xff1a; 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用&#xff0c;但请注明出处&#xff0c;如果有问题&#xff0c;请联系wheeleastgm…

Kinect深度图与摄像头RGB的标定与配准(转载文章)

作者原文地址&#xff1a;http://blog.csdn.net/aichipmunk/article/details/9264703 自从有了Kinect&#xff0c;根据深度图提取前景就非常方便了。因此出现了很多虚拟现实、视频融合等应用。但是&#xff0c;Kinect自身的RGB摄像头分辨率有限&#xff0c;清晰度也不及一些专业…