摘自:http://coffeeandsandwich.com/?p=8

在 iOS 6 和 Mac OS X 10.8 以前,定义枚举类型的方式如下:

typedef enum the_enum_name{
value_1,
value_2,
value_3
}the_enum_type_name;

注意:
1.  the_enum_name 和 the_enum_type_name 可以是一样的。
2. 你甚至可以不写 the_enum_name,只写 the_enum_type_name。

从iOS6和Mac OS X 10.8开始,苹果允许你使用新的方式来定义枚举类型

typedef NS_ENUM(NSInteger, the_enum_type_name){
value_1,
value_2,
value_3
};

NS_ENUM 的第一个参数用来声明枚举值们所属的类型,只能是整形数值类型,一般都是用NSInteger就可以了。第二个参数是枚举类型的名字。

那么这两者有什么差别呢?实际上差别不大,不过后者更直观,而且 NS_ENUM 第二个参数则直接取代了前者的 the_enum_name 和 the_enum_type_name。

另外,枚举类型还能进行位运算。你可以使用 | 进行或运算或者 & 进行与运算。不过需要用 NS_OPTIONS  来定义,例如iOS里有个 UIViewAutoresizing  的枚举类型,它的定义就是下面这样子的:

typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
UIViewAutoresizingNone = ,
UIViewAutoresizingFlexibleLeftMargin = << ,
UIViewAutoresizingFlexibleWidth = << ,
UIViewAutoresizingFlexibleRightMargin = << ,
UIViewAutoresizingFlexibleTopMargin = << ,
UIViewAutoresizingFlexibleHeight = << ,
UIViewAutoresizingFlexibleBottomMargin = <<
};

这个枚举类型是用来指定当控件的容器(比如说窗口)的大小发生变化时,控件的大小和位置应当如何变化,如果希望这个控件的宽度不变,只改变左右边距,那么可以这样负值:

someButton.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;

参考:

What is a typedef enum in Objective-C?
http://stackoverflow.com/questions/707512/what-is-a-typedef-enum-in-objective-c

NS_ENUM & NS_OPTIONS
http://nshipster.com/ns_enum-ns_options/

Object-C: 枚举的更多相关文章

  1. [Effective JavaScript 笔记]第43条:使用Object的直接实例构造轻量级的字典

    js对象的核心是一个字符串属性名与属性值的映射表.使用对象实现字典易如反掌,字典是可变长的字符串与值的映射集合. for...in js提供了枚举一个对象属性名的利器--for...in循环. var ...

  2. C#中枚举类型和int类型的转化

    先定义一个枚举类型 , 初中, 高中,大学 }; int ->enum int d=2; PropertyType  a=(PropertyType)d; int <- enum Prop ...

  3. NSStirng、NSArray、以及枚举(Method小集合)

    Object-c代码 /**************************************************************************************** ...

  4. 枚举工具类 EnumUtils

    这是一个枚举工具类,有时候一个枚举自身为空,我们程序在调用他的方法时(如:name(),ordinal()),就会报空指针异常:下面写这个工具类就是为了来避免这些问题的,有些外部引用的没有贴出来,不过 ...

  5. Object.defineProperty基本用法

    1. 基本形式 Object.defineProperty(obj,prop,descriptor) 参数说明: obj: 必需,目标对象prop: 必需,需定义或修改属性的名字descriptor: ...

  6. 关于Object.defineProperty 的基础知识

    Object.defineProperty 这个方法大家耳熟能详,可以对 对象的属性进行添加或修改的操作.即可以进行  数据劫持 .vue就是通过这个方法来劫持数据的. 平时我们创建对象的时候,一般通 ...

  7. 【Java基础】关于枚举类你可能不知道的事

    目录 谈谈枚举 1. 枚举类的定义 2. 枚举类的底层实现 3. 枚举类的序列化实现 4. 用枚举实现单列 5. 枚举实例的创建过程是线程安全的 谈谈枚举 如果一个类的对象个数是有限的而且是不变的,我 ...

  8. 关于 Object.defineProperty()

    通常,定义或者修改一个JS对象,有以下方式: // 1. 字面量 let obj = { name: 'cedric', age: 18 } // 2. new Object() let obj = ...

  9. vue2.x版本中Object.defineProperty对象属性监听和关联

    前言 在vue2.x版本官方文档中 深入响应式原理 https://cn.vuejs.org/v2/guide/reactivity.html一文的解释当中,Object.defineProperty ...

  10. 【C#公共帮助类】 ToolsHelper帮助类

    这个帮助类,目前我们只用到了两个,我就先更新这两个,后面有用到的,我会继续更新这个Helper帮助类 在Tools.cs中 有很多方法 跟Utils里是重复的,而且Utils里的方法更加新一点,大家可 ...

随机推荐

  1. 鸟哥的linux私房菜之磁盘与文件系统管理

    superblock:记录了该文件系统的整体信息包括inode/block的总量,使用量,剩余量以及文件系统的格式与相关信息. inode:记录档案的属性,一个档案占用一个inode,同事记录此档案所 ...

  2. EL表达式简介

    EL表达式简介 EL 全名为Expression Language.EL主要作用: 1.获取数据 EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象.获取数据. ...

  3. 160907、CSS 预处理器-Less

    CSS 预处理器是什么?一般来说,它们基于 CSS 扩展了一套属于自己的 DSL,来解决我们书写 CSS 时难以解决的问题: 语法不够强大,比如无法嵌套书写导致模块化开发中需要书写很多重复的选择器: ...

  4. LCD参数解释及计算【转】

    转自:http://blog.csdn.net/longxiaowu/article/details/24319933 Linux内核的amba lcd控制器使用clcd_panel结构体表示一个LC ...

  5. Maven之Nexus构建企业级Maven仓库

    什么是Nexus? Nexus是Maven仓库管理器,用来搭建一个本地仓库服务器,这样做的好处是便于管理,节省网络资源,速度快,还有一个非常有用的功能就是可以通过项目的SNAPSHOT版本管理,来进行 ...

  6. export

    export export PATH=$PATH:/ROOT

  7. js原型 prototype

    js中只有构造函数(所有函数)拥有prototype属性对象

  8. 简单排序算法设计(Java)

    总共有八种排序算法,还是慢慢看吧 1.简单排序算法 简单排序算法就是设置标兵,逐个比较数,然后查找插入位置,插入 public static void p(int[] a){ for(int i=0; ...

  9. C#'~'按位取反运算符的使用

    按位取反运算符是按照二进制的每一位取反,比如byte类型,~0的结果就是255. 该功能可以在mask中做一些反转操作 如下代码,a存放了2,4,8三个值.用按位取反'~'运算符反转 打印结果是 fa ...

  10. JAVA基础知识之Map集合

    Map的内部结构Entry Set与Map的关系 Map的内部类Entry Map的通用方法及Map的简单用法 HashMap和HashTable的区别 HashMap和HashTable判断元素相等 ...