一般情况下,我们采用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. 图片流量节省大杀器:基于CDN的sharpP自适应图片技术实践

    版权声明:本文由陈忱原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/156 来源:腾云阁 https://www.qclou ...

  2. linux笔记:RPM软件包管理-rpm命令管理

    rpm包命名原则: rpm包的依赖性: 包名和包全名: rpm软件包安装.升级和卸载: rpm软件包查询: 从rpm包中提取指定文件:

  3. redis订阅发布

    一.简介 Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个key值进行消息发布及消息订阅,当一个key值上进行了消息发布后,所有订 ...

  4. Java位操作全面总结

    转载: Java位操作全面总结 在计算机中所有数据都是以二进制的形式储存的.位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快.在实际编程中,如果能巧妙运用位操作,完全可以达到 ...

  5. python中的md5加密

    import md5 import types def get_md5(data): if type(data) is not types.StringType: # 检验输入的数据是否为字符串 pr ...

  6. hdu----(1671)Phone List(Trie带标签)

    Phone List Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  7. Scout YYF I(POJ 3744)

    Scout YYF I Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5565   Accepted: 1553 Descr ...

  8. css改变图片的颜色

    参考大神张鑫旭:http://www.zhangxinxu.com/wordpress/2016/06/png-icon-change-color-by-css/ 主要知识点:border-right ...

  9. 【源码下载】分享一个支持自安装自卸载的Windows服务

    NetworkComms网络通信框架序言 这个程序来自  www.codeproject.com 具体的出处就忘了 服务器端的程序,我一般采用在windows服务中调用打开的方式,这样既能看到界面,又 ...

  10. PHP Memcached应用实现代码

    一.memcached 简介 在很多场合,我们都会听到 memcached 这个名字,但很多同学只是听过,并没有用过或实际了解过,只知道它是一个很不错的东东.这里简单介绍一下,memcached 是高 ...