NS_ENUM & NS_OPTIONS 枚举
2015-09-12 11:29
585 查看
NS_ENUM和
NS_OPTIONS都不算太古老的宏,在iOS 6 / OS X Mountain Lion才开始有,他们都是代替
enum的更好的办法。
如果你想在更早的iOS或OS X系统中使用这两个宏,简单定义一下就好了:
Objective-C
#ifndef NS_ENUM #define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type #endif
enum,或者其他枚举类型(例如每周的星期几,或TableViewCell的类型等),都是通过C的方法去为预设值定义常量。在一个
enum定义中,没有被赋予特别值的常量都会自动被赋为从0开始的连续值。
有几种合法的方式来定义
enum。容易产生困惑的地方是它们每种方法之间略有不同,但不必须想太多,任选一种即可。
例如:
Objective-C
enum { UITableViewCellStyleDefault, UITableViewCellStyleValue1, UITableViewCellStyleValue2, UITableViewCellStyleSubtitle };
...定义整型值,但不定义类型。
另一种方法:
Objective-C
typedef enum { UITableViewCellStyleDefault, UITableViewCellStyleValue1, UITableViewCellStyleValue2, UITableViewCellStyleSubtitle } UITableViewCellStyle;
...定义适合特性参数的
UITableViewCellStyle类型。
然而,之前苹果自己的代码中都用这种方法来定义
enum:
Objective-C
typedef enum { UITableViewCellStyleDefault, UITableViewCellStyleValue1, UITableViewCellStyleValue2, UITableViewCellStyleSubtitle };
typedef NSInteger UITableViewCellStyle;
...这种方法给出了
UITableViewCellStyle确定的大小,但并没有告诉编译器这个类型和之前的
enum有什么关系。
让我感动的是苹果终于给了这个“宏统一”的
NS_ENUM。
NS_ENUM
从现在开始 UITableViewCellStyle的定义已经变成这个样子了:
Objective-C
typedef NS_ENUM(NSInteger, UITableViewCellStyle) { UITableViewCellStyleDefault, UITableViewCellStyleValue1, UITableViewCellStyleValue2, UITableViewCellStyleSubtitle };
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/
相关文章推荐
- linux内核裁剪及编译可加载模块
- Linux环境下安装mysql
- 安装配置PHP 5.6 + Nginx 1.8
- linux并发连接上百万的配置
- Nginx基础. Nginx通配散列表
- Nginx基础. Nginx基本哈希构成
- 利用vSphere进行copy虚拟机
- 如何在Linux上安装Suricata入侵检测系统?
- Network Lasso: Clustering and Optimization in Large Graphs
- Nginx性能优化
- Linux系统启动流程学习笔记
- LINUX学习之-centos7营救模式
- AJAX在Tomcat8下传值问题。
- 每天一个linux命令(1):ls命令
- 【转】网站出现service unavailable的解决方法
- Nginx基础. Nginx中内存地址对齐(转)
- sofa-pbrpc源码分析之RpcServerOptions
- Linux 之C++ 线程池
- keepalived实现nginx反向代理高可用
- Linux多线程相关事例