一般情况下,我们采用C风格的enum关键字可以定义枚举类型。

  1. enum{
  2. UIViewAnimationTransitionNone,
  3. UIViewAnimationTransitionFlipFromLeft,
  4. UIViewAnimationTransitionFlipFromRight,
  5. UIViewAnimationTransitionCurlUp,
  6. UIViewAnimationTransitionCurlDown,
  7. } UIViewAnimationTransition;
  1. //位移操作枚举定义
  2. enum {
  3. UIViewAutoresizingNone                 = 0,
  4. UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
  5. UIViewAutoresizingFlexibleWidth        = 1 << 1,
  6. UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
  7. UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
  8. UIViewAutoresizingFlexibleHeight       = 1 << 4,
  9. UIViewAutoresizingFlexibleBottomMargin = 1 << 5
  10. };
  11. typedef NSUInteger UIViewAutoresizing;//使用NSUInteger的地方可以使用UIViewAutoresizing,//UIViewAutoresizing相当于NSUInteger的一个别名使用。
  12. //因此一个UIViewAutoresizing的变量可以直接赋值给NSUInteger

枚举值一般是4个字节的int值,在64位系统上是8个字节。

在iOS6和Mac OS 10.8以后Apple引入了两个宏来重新定义这两个枚举类型,实际上是将enum定义和typedef合二为一,并且采用不同的宏来从代码角度来区分。

NS_OPTIONS一般用来定义位移相关操作的枚举值,我们可以参考UIKit.Framework的头文件,可以看到大量的枚举定义。

  1. typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {
  2. UIViewAnimationTransitionNone,//默认从0开始
  3. UIViewAnimationTransitionFlipFromLeft,
  4. UIViewAnimationTransitionFlipFromRight,
  5. UIViewAnimationTransitionCurlUp,
  6. UIViewAnimationTransitionCurlDown,
  7. };
  8. typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
  9. UIViewAutoresizingNone                 = 0,
  10. UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
  11. UIViewAutoresizingFlexibleWidth        = 1 << 1,
  12. UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
  13. UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
  14. UIViewAutoresizingFlexibleHeight       = 1 << 4,
  15. UIViewAutoresizingFlexibleBottomMargin = 1 << 5
  16. };

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

  1. #if (__cplusplus && __cplusplus >= 201103L && (__has_extension(cxx_strong_enums) || __has_feature(objc_fixed_enum))) || (!__cplusplus && __has_feature(objc_fixed_enum))
  2. #define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type
  3. #if (__cplusplus)
  4. #define NS_OPTIONS(_type, _name) _type _name; enum : _type
  5. #else
  6. #define NS_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type
  7. #endif
  8. #else
  9. #define NS_ENUM(_type, _name) _type _name; enum
  10. #define NS_OPTIONS(_type, _name) _type _name; enum
  11. #endif

  1. typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {
 展开得到:
  1. typedef enum UIViewAnimationTransition : NSInteger UIViewAnimationTransition;
  2. enum UIViewAnimationTransition : NSInteger {

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

实际使用时,可以直接定义:

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

等效于上述定义。

参考文档:

1. http://nshipster.com/ns_enum-ns_options/

2.http://iamthewalr.us/blog/2012/11/ns_enum-and-ns_options/

iOS: 枚举类型 enum,NS_ENUM,NS_OPTIONS的更多相关文章

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

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

  2. 【转】java枚举类型enum的使用

    原文网址:http://blog.csdn.net/wgw335363240/article/details/6359614 java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到 ...

  3. C# 中的枚举类型 enum (属于值类型)

    原文 C# 中的枚举类型 enum (属于值类型) C# 支持两种特殊的值类型:枚举和结构. 声明枚举:声明时要声明所有可能的值. using System; using System.Collect ...

  4. 转载 java枚举类型enum的使用 (原文地址:http://blog.csdn.net/wgw335363240/article/details/6359614)

    java枚举类型enum的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java中定义的常量值不采用enmu枚举类型,而采用public final static 类型来定义呢?以前我们都是采 ...

  5. 枚举类型enum详解——C语言

    enum enum是C语言中的一个关键字,enum叫枚举数据类型,枚举数据类型描述的是一组整型值的集合(这句话其实不太妥当),枚举型是预处理指令#define的替代,枚举和宏其实非常类似,宏在预处理阶 ...

  6. 深入理解Java枚举类型(enum)

    https://blog.csdn.net/javazejian/article/details/71333103 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(en ...

  7. 人生苦短之Python枚举类型enum

    枚举类型enum是比较重要的一个数据类型,它是一种数据类型而不是数据结构,我们通常将一组常用的常数声明成枚举类型方便后续的使用.当一个变量有几种可能的取值的时候,我们将它定义为枚举类型.在Python ...

  8. 全面解读Java中的枚举类型enum的使用

    这篇文章主要介绍了Java中的枚举类型enum的使用,开始之前先讲解了枚举的用处,然后还举了枚举在操作数据库时的实例,需要的朋友可以参考下 关于枚举 大多数地方写的枚举都是给一个枚举然后例子就开始sw ...

  9. Java基础之枚举类型Enum的使用

    Java基础之枚举类型Enum的使用 定义 public enum AccruedCleanEnum { SPREAD("1","发票"),OTHER(&quo ...

随机推荐

  1. 安卓手机与电脑无线传输文件(利用ftp服务)

    安卓手机与电脑无线传输文件(利用ftp服务) 手机与电脑无线传输文件,手机开启ftp服务,电脑能够对手机内全部文件进行全方位管理,包括上传.下载.新建.删除等,而且手机和电脑能够双向传输,很方便.手机 ...

  2. 《云中歌》孟石头泡妞大法独家放送,单身汪get起来!!

    谁说古代文人雅士只会诗词歌赋.琴棋书画?作为“玉中之王”的公子哥——孟石头泡妞可是个中高手,总结起来都能出一本“泡妞宝典”了,单身的乃们还不赶紧学起来! 第一步:假装自来熟相识,马上开启约会模式 看到 ...

  3. iOS 打包静态类库 lib.a

    iOS 打包静态类库 lib.a 流程 1: xcode---新建项目---iOS-framework&Library-----Cocoa touch Static Library----Ne ...

  4. innodb_fast_shutdown中值为1或者2的区别是?

    innodb_fast_shutdown=0 , 1 , 2时的意思分别是 0 把buffer pool中的脏页刷到磁盘和合并insert buffer,当然包括redo log也会写到磁盘中. 2 ...

  5. Calendar类中add/set/roll方法的区别

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  6. linux笔记:文件处理命令touch,cat,more,less,head,tail

    命令名称:touch功能:新建文件命令所在目录:/bin/touch用法:touch 文件名 命令名称:cat功能:显示文件内容命令所在目录:/bin/cat用法:cat [-n] 文件名参数:-n ...

  7. [maven] settings 文件节点配置详解

    基本结构 <settings xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3. ...

  8. java中的异常和处理

    算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数组负下标异常:NegativeAr ...

  9. C++ 如何重复利用一个内存地址块

    #include<iostream> using namespace std; ; }; int main(int argv ,char * args[]) { double *p1,*p ...

  10. ABAP_常用函数整理_傻X版

    输出前导0:CONVERSION_EXIT_ALPHA_INPUT 单位转换:CONVERSION_EXIT_CUNIT_INPUT 单位换算:UNIT_CONVERSION_SIMPLE 修改订单组 ...