NS_ENUM和NS_OPTIONS
NS_ENUM 和 NS_OPTIONS 在iOS 6 / OS X Mountain Lion才开始有,他们都是用来代替 enum 的。
借用C的写法:只定义值,不定义类型
1 enum {
3 UITableViewCellStyleValue1,
4 UITableViewCellStyleValue2,
5 UITableViewCellStyleSubtitle
6 };
借用C的写法:定义值的同时定义类型
1 typedef enum {
3 UITableViewCellStyleValue1,
4 UITableViewCellStyleValue2,
5 UITableViewCellStyleSubtitle
6 } UITableViewCellStyle;
特性参数类型: UITableViewCellStyle
苹果自己的方法:之前苹果自己的代码
1 typedef enum {
3 UITableViewCellStyleValue1,
4 UITableViewCellStyleValue2,
5 UITableViewCellStyleSubtitle
6 };
7
8 typedef NSInteger UITableViewCellStyle;
给出了 UITableViewCellStyle 确定的大小,但并没有告诉编译器这个类型和之前的 enum 有什么关系。
针对以上情况,苹果有了“宏统一”
NS_ENUM的写法:
1 typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
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。