前言:oc中枚举的正确使用,可以增强代码的可读性,减少各种“错误”,让代码更加的规范。下面先介绍枚举的用法,最后介绍个人对枚举的理解,什么是枚举,为什么用枚举。

一. OC中,枚举的使用

1. 写法1格式:关键字 enum 枚举名字{枚举成员,枚举成员2};

 /*
* 枚举 可以写在@interface 里面
**/
enum Test{
test = ,
test1 = ,
};

使用方法:enum 枚举名称 变量名称 = 枚举成员。

 enum Test var = test;
NSLog(@"%u", var);
// 输出值为 1

注意:如果枚举成员不设置值,默认第一个枚举成员值为整型0,后续枚举成员值依次加1。

2.写法2格式,typedef enum 枚举名称{枚举成员}枚举别名;

 /*
定义'枚举类型', Test11 是属性类型 相当于nsstring,int,。。
其中Test1 枚举名字可以省略不写,称“匿名枚举”
**/
typedef enum Test1{
test11 = ,
test12 = ,
}Test11;

使用方法:属性类型 变量名称 = 枚举成员;

 Test11 var1 = test12;
NSLog(@"%u", var1);
// 输出值为 2

注意:typedef enum 定义的枚举,可以理解为枚举类型,相当于nsstring,int等,可用属性类型直接创建变量,然后完成赋值。

这种写法原有的枚举名称可以省略,称“匿名枚举”。

3.写法3,ios6之后,也是最标准的写法,更加的统一,规范。用“NS_ENUM”和“NS_OPTIONS”定义

格式:typedef NS_ENUM(存储类型,属性类型){枚举成员};

 /*
* 存储类型,表示成员变量的值类型,如NSInteger
* 属性类型,上文说到的 枚举别名,可以此名称调用枚举
* 其中 NS_ENUM 多用于一般枚举,NS_OPTIONS 多用于位移枚举
**/
typedef NS_ENUM(NSInteger,Test6){
test61 = ,
test62 = ,
}; typedef NS_OPTIONS(NSUInteger, Test7) {
TestNone = ,
TestA7 = << ,
TestB7 = << ,
TestC7 = << ,
TestD7 = <<
};

使用方法:属性别名 变量名称 = 枚举成员;

Test6 var6 = test62;
NSLog(@"%ld", (long)var6);
// 输出值为 2 Test7 var7 = TestA7 | TestC7;
NSLog(@"%ld", (long)var7);
// 输出值为 5
// 0001 | 0100 = 0101 十进制为5

注意:上面TestC7 1<<2,表示2进制1 左移2位,为0100,与0001 或运算,得到0101,转换十进制为5.

常用枚举用 NS_ENUM,NS_OPTIONS 多用于位移枚举,位的运算(或且非异或等)

二. 枚举错误的写法,编译时不会报错,但是运行报错

 //错误写法1
enum {
test21 = ,
test22 = ,
}Test2; //错误写法2
NS_ENUM(NSInteger,Test3){
test31 = ,
test32 = ,
}; //错误写法3
NS_OPTIONS(NSUInteger, Test4){
test41 = ,
test42 = ,
}; NS_OPTIONS(NSUInteger, Test5) {
TestA = << ,
TestB = << ,
TestC = << ,
TestD = <<
};

三. 枚举的理解

1.oc是基于c语言的,在c语言中枚举的定义

在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成这项工作,您的代码可能是:

 #define MON  1
#define TUE 2
#define WED 3
#define THU 4
#define FRI 5
#define SAT 6
#define SUN 7

这样很繁琐,在此,我们定义一种新的数据类型,希望它能完成同样的工作。这种新的数据类型叫枚举型。

2.枚举用于规范的定义代码中的状态、选项等“常量”。

其中状态与选项的概念区别(states and options)

状态,同时只能有一种,如“OK”,“Error”,不可能同时是OK和Error。
选项,同时可以有一种或一种以上,如App可以同时支持横屏和竖屏,横屏竖屏在这个时候就是“屏幕方向”的两种不同的选项。

总结:

个人觉得枚举还是有必要掌握的,格式清晰,使用简便。能减少代码的冗余度,提高代码规范,增强可读性.

ps:第一次总结,有错误之处还请指正,thanks,荆轲刺秦王~~

参考文档1:https://www.cnblogs.com/JCSU/articles/1299051.html

参考文档2:https://blog.csdn.net/snow_xuey/article/details/55258875

参考文档3:https://blog.csdn.net/imkata/article/details/78861077

IOS 枚举 enum的更多相关文章

  1. iOS 枚举ENUM和OPTIONS的区别

  2. iOS 枚举 初体验

    iOS枚举 我的code /*文件名 SC_CDV_OCR.m*/ typedef enum _OCRResultState { OCRResultStateOK = 1, OCRResultStat ...

  3. MySQL字段之集合(set)枚举(enum)

    MySQL字段之集合(set)枚举(enum) (2008-12-23 13:51:23) 标签:it  分类:MySQL 集合 SET mysql> create table jihe(f1 ...

  4. 枚举 enum

    typedef enum : NSUInteger { <#MyEnumValueA#>, <#MyEnumValueB#>, <#MyEnumValueC#>, ...

  5. 枚举enum学习小记

    参考文献: [1]C++程序设计语言(特别版), 裘宗燕译, 机械工业出版社 [2]C++ Primer (3rd Ed.), S.B. Lippman and J. Lajoie, 人民邮电出版社 ...

  6. Java 枚举(enum) 详解7种常见的用法

    Java 枚举(enum) 详解7种常见的用法 来源 https://blog.csdn.net/qq_27093465/article/details/52180865 JDK1.5引入了新的类型— ...

  7. Python 枚举 enum

    Python 枚举 enum enum 标准模块在 3.4 版本才可以使用,3.3 以下版本需要独立安装:https://pypi.python.org/pypi/enum34#downloads,官 ...

  8. 【转】结构struct 联合Union和枚举Enum的细节讨论

    结构struct 联合Union和枚举Enum的细节讨论 联合(Union)是一种构造数据类型,它提供了一种使不同类型数据类型成员之间共享存储空间的方法,同时可以实现不同类型数据成员之间的自动类型转换 ...

  9. 枚举Enum和常量0之间的恩怨

    1,任何为0的常量表达式都能隐式的转换成枚举Enum. 对于这一点,在程序中没少吃苦头.特别是对于函数重载的情况,往往让人一头雾水. 看看下面的代码(摘自MSDN),你能猜到输出吗? public e ...

随机推荐

  1. linux 共享目录

    1. 文件上传遇到多物理机多实例时,怎么处理呢? ftp, 文件同步, 目录共享 这里用目录共享来一把. 2. 操作流程 物理机两台 192.168.1.88  192.168.1.166 2.1 服 ...

  2. C#开发小技巧

    001.判断一个Form是否已关闭并释放,需要从引用和对象两方面来判断,判断引用是否为null:mainfm==null判断引用的对象是否已释放:mainfm.IsDisposedMainFormma ...

  3. 申请单位iOS开发者账号

    没有AppleID的需要先申请:此处略过: 1.登录苹果开发者官网(https://developer.apple.com),网速比较慢,多试几次 2. 点击 Enroll 切换到 简体中文 我以下述 ...

  4. 解决MFC对话框类不能建立成功的方法(出现unable to open the files XX for class XX)

    原文:http://blog.163.com/wangqi1973_off/blog/static/131034571201011885546230 为新加的对话框资源添加新类,类名取做CColorV ...

  5. Qt 资料大全

    https://blog.csdn.net/liang19890820/article/details/51752029 简述 发福利了.发福利了.发福利了,重要的事情说三遍... 为了方便更多Qte ...

  6. sql优化1

    1.mysql里面的索引 对于 like关键字匹配查询,适用于like name%,但是不适用于%name%;添加索引时候注意这点 2.mysql的limit分页 ,limit 2,5;表示每页显示5 ...

  7. 如何使用idea把web项目打成war包

    如果是maven项目,打成war包很容易,如果是web项目,需要这样子 1. 2. 3. output directory是war包的目录 4.重新选择 第一步的操作,选择build即可.

  8. SQL计算上下两行某列的差

    SELECT * FROM #TempHuDong SELECT * FROM #TempHuDong SELECT TOP 1 ABS(a.num -b.num) '差' FROM (select ...

  9. WCF安全 z

    WCF custom authentication using ServiceCredentials The generally accepted way of authenticating a us ...

  10. angular2 应用 不同的environment 进行 build/serve

    文件目录如下: 命令行使用:ng serve --e=dev/offline/prod build 不同,像上面那样写没用.必须后面再加--prod 如: ng build --e=offline - ...