一般情况下,我们采用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. ASP.NET Core身份识别

    Introduction to Identity 66 of 93 people found this helpful By Pranav Rastogi, Rick Anderson, Tom Dy ...

  2. Android要点记录

    1.Toolbar不能上滑隐藏的原因<!--如果在CoordinatorLayout加上android:fitsSystemWindows="true",而不是在AppLay ...

  3. jmeter笔记7

    一.脚本录制(Jmeter): Jmeter 脚本(.jmx)为 xml 格式,树形结构,由元件组成,使用“取样器”产生请求. 在“工作台”添加“HTTP 代理服务器” 端口: 代理服务器的端口,默认 ...

  4. IE中JavaScript 的异常处理

    错误类型 编程中我们会遇到四种错误:编译错误.逻辑错误.输入/验证错误.运行时错误,但是在JavaScript中我们只能最后两种错误. JavaScript 1.5定义了六种错误类型: EvalErr ...

  5. jquery 实现 点击按钮后倒计时效果,多用于实现发送手机验证码、邮箱验证码

    原文链接:http://www.cnblogs.com/steed-zgf/archive/2012/02/03/2336984.html <!DOCTYPE html PUBLIC " ...

  6. spring3表达式语言(SpEL)

    使用SpEl进行表达式操作,基本操作如下: <!--第一步,构建解析 --> ExpressionParser parser = new SpelExpressionParser(); & ...

  7. IO流 总结二

    流只能操作数据. File 类 用来将文件或者文件夹封装成对象. 方便文件与文件夹进行操作 File对象可以作为参数传递给流的构造函数. 可以将已有的和已出现的文件或者文件夹封装成对象 File a ...

  8. spring使用jackson返回object报错:Handler execution resulted in exception: Could not find acceptable representation

    问题:在springmvc中添加Jackson jar包返回Object类型,处理器方法的produces属性不写,默认根据类型,但如果指定了(错误原因)produces = "text/h ...

  9. js-分享107个js中的非常实用的小技巧(借鉴保存)

    转载原文:http://***/Show.aspx?id=285 1.document.write(""); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:doc ...

  10. struts2视频学习笔记 01-02

    网易云课堂-<struts2> 课时1 Struts2: WebWork2基础上发展而来,MVC框架,无侵入式设计. 提供了拦截器,类型转换器,支持多种表现层技术(JSP, freeMar ...