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

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

[cpp] view plaincopy

  1. enum{
  2. UIViewAnimationTransitionNone,
  3. UIViewAnimationTransitionFlipFromLeft,
  4. UIViewAnimationTransitionFlipFromRight,
  5. UIViewAnimationTransitionCurlUp,
  6. UIViewAnimationTransitionCurlDown,
  7. } UIViewAnimationTransition;

[cpp] view plaincopy

  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的头文件,可以看到大量的枚举定义。

[cpp] view plaincopy

  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中:

[cpp] view plaincopy

  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

[cpp] view plaincopy

  1. typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {

展开得到:

[cpp] view plaincopy

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

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

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

[cpp] view plaincopy

  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/

原文:http://blog.csdn.net/annkie/article/details/9877643

枚举其实很重要,特别是在应用开发初期,服务器端数据格式需要更改得情况下,枚举和宏都能是程序简洁,并且改动小。

网上有个人写的言简意赅,适合初学

转自:http://blog.csdn.net/ysy441088327/article/details/8012677

题记: 蛋疼的枚举, 千万别小视了! 进入正题: 首先要知道的是,枚举值 它是一个整形(int) 并且,它不参加内存的占用和释放 枚举定义变量即可直接使用,不用初始化. 枚举的定义如下:

typedef enum {

//以下是枚举成员 TestA = 0,

TestB,

TestC,

TestD

}Test;//枚举名称

亦可以如下定义(推荐:结构比较清晰):

typedef NS_ENUM(NSInteger, Test1) {

//以下是枚举成员

Test1A = 0,

Test1B = 1,

Test1C = 2,

Test1D = 3

};

枚举的定义还支持位运算的方式定义,如下: 等于号后面必须等于1

typedef NS_ENUM(NSInteger, Test) {

TestA = 1, //1 1 1

TestB = 1 << 1, //2 2 10 转换成 10进制 2

TestC = 1 << 2, //4 3 100 转换成 10进制 4

TestD = 1 << 3, //8 4 1000 转换成 10进制 8

TestE = 1 << 4 //16 5 10000 转换成 10进制 16

};

什么时候要用到这种方式呢? 那就是一个枚举变量可能要代表多个枚举值的时候. 其实给一个枚举变量赋予多个枚举值的时候,原理只是把各个枚举值加起来罢了. 当加起来以后,就获取了一个新的值,那么为了保证这个值的唯一性,这个时候就体现了位运算的重要作用. 位运算可以确保枚举值组合的唯一性. 因为位运算的计算方式是将二进制转换成十进制,也就是说,枚举值里面存取的是 计算后的十进制值. 打个比方: 通过上面的位运算方式设定好枚举以后,打印出来的枚举值分别是: 1 2 4 8 16 这5个数字,无论你如何组合在一起,也不会产生两个同样的数字.

多枚举值 赋值方式如下:

Test tes = (TestA|TestB);

判断枚举变量是否包含某个固定的枚举值,使用前需要确保枚举值以及各个组合的唯一性:

NSLog(@"%d %d %d %d %d",TestA,TestB,TestC,TestD,TestE);

Test tes = (TestA|TestB); NSLog(@"%d",tes);

NSLog(@"%d",(tes & TestA));

if ((tes & TestA)) { NSLog(@"有"); }

else { NSLog(@"没有"); } NSLog(@"%d",(tes & TestB));

if ((tes & TestA)) { NSLog(@"有"); }

else { NSLog(@"没有"); }

NSLog(@"%d",(tes & TestC));

if ((tes & TestC)) { NSLog(@"有"); }

else { NSLog(@"没有"); }

如果 没有包含,将返回0, 0表示false NO 则进入else 也可以随时为枚举变量累加某个值,但是要自己控制不要添加已经加入过的枚举值, 枚举变量的值不会有变动,但这样将会误导阅读代码的人

有累加,自然有累减了,如果累减不存在的枚举值, 那么本次累减的枚举值,会自动累加上去.

tes^= TestE;

iOS/object-c: 枚举类型 enum,NS_ENUM,NS_OPTIONS,布布扣,bubuko.com

时间: 2024-10-27 11:04:28

iOS/object-c: 枚举类型 enum,NS_ENUM,NS_OPTIONS的相关文章

iOS - 枚举类型 enum,NS_ENUM,NS_OPTIONS

一般情况下,我们采用C风格的enum关键字可以定义枚举类型. enum{ UIViewAnimationTransitionNone, UIViewAnimationTransitionFlipFromLeft, UIViewAnimationTransitionFlipFromRight, UIViewAnimationTransitionCurlUp, UIViewAnimationTransitionCurlDown, } UIViewAnimationTransition; //位移操作

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

原文网址:http://blog.csdn.net/wgw335363240/article/details/6359614 java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java 中定义的常量值不采用enmu 枚举类型,而采用public final static 类型来定义呢?以前我们都是采用这种方式定义的,很少采用enum 定义,所以也都没有注意过,面对突入起来的问题,还真有点不太清楚为什么有这样的定义.既然不明白就抽时间研究下吧. Java 中的枚举

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

[版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/71333103 出自[zejian的博客] 关联文章: 理解Java位运算 深入理解Java类型信息(Class对象)与反射机制 本篇主要是深入对Java中枚举类型进行分析,主要内容如下: 理解枚举类型 枚举的定义 枚举实现原理 枚举的常见方法 Enum抽象类常见方法 编译器生成的Values方法与ValueOf方法 枚举与Clas

java 枚举类型enum 的使用

java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java 中定义的常量值不采用enmu 枚举类型,而采用public final static 类型来定义呢?以前我们都是采用这种方式定义的,很少采用enum 定义,所以也都没有注意过,面对突入起来的问题,还真有点不太清楚为什么有这样的定义.既然不明白就抽时间研究下吧. Java 中的枚举类型采用关键字enum 来定义,从jdk1.5才有的新类型,所有的枚举类型都是继承自Enum 类型.要了解枚举类型,建议大家先

人生苦短之Python枚举类型enum

枚举类型enum是比较重要的一个数据类型,它是一种数据类型而不是数据结构,我们通常将一组常用的常数声明成枚举类型方便后续的使用.当一个变量有几种可能的取值的时候,我们将它定义为枚举类型.在Python中是如何实现的呢? 补充:很多初学者一下子不明白枚举是什么意思,比如我们有段程序很多地方需要用到12个月月份,可以将每个月份都定义出来使用: String Jan = "1月份",但是这样用起来很不好用,需要写12个,然后后续用的时候也不清晰明白,那么枚举类型就可以解决问题,它将这12个月

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

原文 C# 中的枚举类型 enum (属于值类型) C# 支持两种特殊的值类型:枚举和结构. 声明枚举:声明时要声明所有可能的值. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace enumType { enum Season // enum 类型定义在 class 外面 { Spring, Summer, Fall, Winter // 最后一个元素后面

Asp.Net 将枚举类型(enum)绑定到ListControl(DropDownList)控件

在开发过程中一些状态的表示使用到枚举类型,那么如何将枚举类型直接绑定到ListControl(DropDownList)是本次的主题,废话不多说了,直接代码: 首先看工具类代码: /// <summary> /// 通过枚举类型 绑定到ListControl 控件的通用类 /// 用法:直接传入要绑定的Control: EnumManager<枚举>.Bind_Enum_Control(ListControl); /// </summary> /// <typep

Java枚举类型enum使用详解

java的Enum枚举类型终于在j2se1.5出现了.之前觉得它只不过是鸡肋而已,可有可无.毕竟这么多年来,没有它,大家不都过得很好吗?今日看<Thinking in Java>4th edition,里面有一句话“有时恰恰因为它,你才能够"优雅而干净"地解决问题.优雅与清晰很重要,正式它们区别了成功的解决方案与失败的解决方案.而失败的解决方案就是因为其他人无法理他."使用Enum枚举类型,可以将以前笨拙的代码变得优雅简单?但是,我同时也在思考另外一个问题,使用新

java 枚举类型enum

简单介绍 Java 中的枚举类型采用关键字enum 来定义,从jdk1.5才有的新类型,所有的枚举类型都是继承自Enum 类型.要了解枚举类型,建议大家先打开jdk 中的Enum 类简单读一下,这个类里面定义了很多protected 方法,比如构造函数,如果要使用这些方法我们可以把枚举类型定义到当前类中.每个枚举类型,都有自己的名字和顺序,当我们输出一个枚举类型的时候,会输入枚举类型的name ,具体可以参考下面的例子. 一.   通常定义常量方法 我们通常利用public final stat