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 topbottom left  right marginswidthheight组合的位掩码。

 

 不像 NS_ENUM ,位掩码用 NS_OPTIONS 宏。

 

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

 

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

 

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

posted @ 2014-10-10 17:57  妮妮1018  阅读(539)  评论(0编辑  收藏  举报