NS_ENUM和NS_OPTIONS

NS_ENUM 和 NS_OPTIONS 在iOS 6 / OS X Mountain Lion才开始有,他们都是用来代替 enum 的。

借用C的写法:只定义值,不定义类型

1 enum {

2  UITableViewCellStyleDefault,
3  UITableViewCellStyleValue1,
4  UITableViewCellStyleValue2,
5  UITableViewCellStyleSubtitle
6  };

借用C的写法:定义值的同时定义类型

1 typedef enum {

2  UITableViewCellStyleDefault,
3  UITableViewCellStyleValue1,
4  UITableViewCellStyleValue2,
5  UITableViewCellStyleSubtitle
6  } UITableViewCellStyle;

特性参数类型: UITableViewCellStyle

苹果自己的方法:之前苹果自己的代码

1 typedef enum {

2  UITableViewCellStyleDefault,
3  UITableViewCellStyleValue1,
4  UITableViewCellStyleValue2,
5  UITableViewCellStyleSubtitle
6  };
7  
8  typedef NSInteger UITableViewCellStyle;

给出了 UITableViewCellStyle 确定的大小,但并没有告诉编译器这个类型和之前的 enum 有什么关系。

针对以上情况,苹果有了“宏统一”

NS_ENUM的写法:

1 typedef NS_ENUM(NSInteger, UITableViewCellStyle) {

2  UITableViewCellStyleDefault,
3  UITableViewCellStyleValue1,
4  UITableViewCellStyleValue2,
5  UITableViewCellStyleSubtitle
6  };

NS_ENUM 的第一个参数是用于存储的新类型的类型。在64位环境下,UITableViewCellStyle 和 NSInteger 一样有8bytes长。你要保证你给出的所有值能被该类型容纳,否则就会产生错误。第二个参数是新类型的名字。大括号里面和以前一样,是你要定义的各种值。

这种实现方法提取了之前各种不同实现的优点,甚至有提示编辑器在进行 switch 判断时检查类型匹配的功能。

NS_OPTIONS

enum 也可以被定义为按位掩码(bitmask)。用简单的OR (|)和AND (&)数学运算即可实现对一个整型值的编码。每一个值不是自动被赋予从0开始依次累加1的值,而是手动被赋予一个带有一个bit偏移量的值:类似1 << 0、 1 << 1、 1 << 2等。如果你能够心算出每个数字的二进制表示法,例如:10110 代表 22,每一位都可以被认为是一个单独的布尔值。例如在UIKit中, UIViewAutoresizing 就是一个可以表示任何flexible top、bottom、 left 或 right margins、width、height组合的位掩码。

不像 NS_ENUM ,位掩码用 NS_OPTIONS 宏。

语法和 NS_ENUM 完全相同,但这个宏提示编译器值是如果通过位掩码 | 组合在一起的。同样的,注意值的区间不要超过所使用类型的最大容纳范围。

NS_ENUM 和 NS_OPTIONS 都是Objective-C开发中的提升开发体验的新特性,也再次展示了这门语言在对象化和过程化之间健康和谐的辩证关系。记住这一点,它就好像在你成长的道路中认识到的:我们身边的万物都是运作在矛盾且共存的严谨逻辑关系中。

注:本文是根据:http://nshipster.cn/ns_enum-ns_options/写出的,因原文只能分享到新浪微博,所以这里无法分享,只得把重要内容在这里做了整理。再次感谢Mattt Thompson 和 Croath Liu。

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

时间: 2024-11-10 14:40:30

NS_ENUM和NS_OPTIONS的相关文章

iOS中特有的NS_ENUM和NS_OPTIONS

一般情况下,我们采用C风格的enum关键字可以定义枚举类型. enum{      UIViewAnimationTransitionNone,     UIViewAnimationTransitionFlipFromLeft,     UIViewAnimationTransitionFlipFromRight,     UIViewAnimationTransitionCurlUp,     UIViewAnimationTransitionCurlDown, } UIViewAnimat

NS_ENUM 和 NS_OPTIONS的区别

在苹果的一篇官方文档<Adopting Modern Objective-C>"适应现代的Objectice-c"中提及到使用NS_ENUM和NS_OPTIONS来声明枚举 NS_ENUM用来声明基于一般整形的枚举,而NS_OPTIONS一般用来声明基于位掩码的声明(bitmask) 在一般的教程书中也经常提及,但是其中的区别是什么呢? 在NSObjCRuntime.h中有如下的宏定义 [cpp] view plain copy #define NS_ENUM(_type,

NS_ENUM vs. NS_OPTIONS

NS_ENUM用于定义普通枚举值,NS_OPTIONS用于定义位移相关操作的枚举值: typedef NS_ENUM(NSUInteger, EOCConnectionState) { EOCConnectionStateDisconnected, EOCConnectionStateConnecting, EOCConnectionStateConnected, }; typedef NS_OPTIONS(NSUInteger, EOCPermittedDirection) { EOCPerm

NS_ENUM &amp; NS_OPTIONS

一切皆为对象. 其实有很多种方式你可以在面向过程和面向对象间互相转化,但本文的目的是:有时候抛弃C层面的东西也是很好的. 是的——对于这种Smalltalk一样杂交而成的语言中的非面向对象部分而言,C语言是很有魅力的一部分.它速度快.久经考验,是现代计算最核心的部分.而且当面向对象范式处于过于庞大的设计而显得臃肿不堪的时候,C就变成了你的“安全出口”. 静态函数比硬要塞入类中的方法要好. 枚举比字符串常量要好. 按位掩码比字符串常量组成的数组要好. 过程化指令比runtime hack要好. 一

iOS/object-c: 枚举类型 enum,NS_ENUM,NS_OPTIONS

一般情况下,我们采用C风格的enum关键字可以定义枚举类型. [cpp] view plaincopy enum{ UIViewAnimationTransitionNone, UIViewAnimationTransitionFlipFromLeft, UIViewAnimationTransitionFlipFromRight, UIViewAnimationTransitionCurlUp, UIViewAnimationTransitionCurlDown, } UIViewAnimat

iOS - 枚举类型 enum,NS_ENUM,NS_OPTIONS

一般情况下,我们采用C风格的enum关键字可以定义枚举类型. enum{ UIViewAnimationTransitionNone, UIViewAnimationTransitionFlipFromLeft, UIViewAnimationTransitionFlipFromRight, UIViewAnimationTransitionCurlUp, UIViewAnimationTransitionCurlDown, } UIViewAnimationTransition; //位移操作

在 Swift 中实现 NS_OPTIONS

从Xcode 4.5以后,我们在Objective-C中使用NS_ENUM和NS_OPTIONS来定义一个枚举,以替代C语言枚举的定义方式.其中NS_ENUM用于定义普通的枚举,NS_OPTIONS用于定义选项类型的枚举. 而到了Swift中,枚举增加了更多的特性.它可以包含原始类型(不再局限于整型)以及相关值.正是由于这些原因,枚举在Swift中得到了更广泛的应用.在Foundation中,Objective-C中的NS_ENUM类型的枚举,都会自动转换成Swift中enum,并且更加精炼.以

NS_OPTIONS在swift中怎么实现?

今天在一个ios培训网站上看到一篇博客,讲的是在NS_OPTIONS在Swift中的实现,写得还算比较深刻全面,小编对其进行整理后,分享出来,希望对大家在iOS应用开发上有所帮助吧. 在iOS开发中,我们常常需要定义一个枚举,以替代C语言枚举的定义方式,常用的方法就是在Objective-C中使用NS_ENUM和NS_OPTIONS.其中,NS_ENUM用于定义普通的枚举,NS_OPTIONS用于定义选项类型的枚举. 不同于Objective-C语言,Swift中的枚举增加了更多特性,它可以包含

正确的使用枚举(Enum)

状态与选项的区别(states and options) 在用enum之前,我个人觉得,区分一下状态和选项的概念还是很必要的. 状态,同时只能有一种,如“OK”,“Error”,不可能同时是OK和Error.选项,同时可以有一种或一种以上,如App可以同时支持横屏和竖屏,横屏竖屏在这个时候就是“屏幕方向”的两种不同的选项. 接下来,我们看看如何用枚举定义状态和选项. enum与状态(states) typedef enum _TTGState { TTGStateOK = 0, TTGState