IOS 枚举 enum
前言: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的更多相关文章
- iOS 枚举ENUM和OPTIONS的区别
- iOS 枚举 初体验
iOS枚举 我的code /*文件名 SC_CDV_OCR.m*/ typedef enum _OCRResultState { OCRResultStateOK = 1, OCRResultStat ...
- MySQL字段之集合(set)枚举(enum)
MySQL字段之集合(set)枚举(enum) (2008-12-23 13:51:23) 标签:it 分类:MySQL 集合 SET mysql> create table jihe(f1 ...
- 枚举 enum
typedef enum : NSUInteger { <#MyEnumValueA#>, <#MyEnumValueB#>, <#MyEnumValueC#>, ...
- 枚举enum学习小记
参考文献: [1]C++程序设计语言(特别版), 裘宗燕译, 机械工业出版社 [2]C++ Primer (3rd Ed.), S.B. Lippman and J. Lajoie, 人民邮电出版社 ...
- Java 枚举(enum) 详解7种常见的用法
Java 枚举(enum) 详解7种常见的用法 来源 https://blog.csdn.net/qq_27093465/article/details/52180865 JDK1.5引入了新的类型— ...
- Python 枚举 enum
Python 枚举 enum enum 标准模块在 3.4 版本才可以使用,3.3 以下版本需要独立安装:https://pypi.python.org/pypi/enum34#downloads,官 ...
- 【转】结构struct 联合Union和枚举Enum的细节讨论
结构struct 联合Union和枚举Enum的细节讨论 联合(Union)是一种构造数据类型,它提供了一种使不同类型数据类型成员之间共享存储空间的方法,同时可以实现不同类型数据成员之间的自动类型转换 ...
- 枚举Enum和常量0之间的恩怨
1,任何为0的常量表达式都能隐式的转换成枚举Enum. 对于这一点,在程序中没少吃苦头.特别是对于函数重载的情况,往往让人一头雾水. 看看下面的代码(摘自MSDN),你能猜到输出吗? public e ...
随机推荐
- centos yum安装常用命令
安装killall命令 yum install -y psmisc 安装sz(下载)和rz(上传)命令 yum install -y lrzsz 安装 ifconfig 命令 yum install ...
- SPOJ2666 QTREE4
我是萌萌的传送门 我是另一个萌萌的传送门 一道树分治……简直恶心死了……我在调代码的时候只想说:我*************************************************…… ...
- SQLServer导入大sql文件报错 对 COM 组件的调用返回了错误 HRESULT E_FAIL。 (mscorlib)
打开cmd执行(d:\script.sql为sql文件位置): sqlcmd -S 127.0.0.1 -U sa -P sa -i d:\script.sql From:https://ww ...
- C++类继承--基类new和用派生类new的区别
实际上无论是用基类还是派生类New, 结果是一样的: #include <stdio.h> class Base { public: int a; Base(){ a=0; } virtu ...
- Generic/Template Programming in Flink
Generic/Template Programming in Flink SourceFunction<T> @Public public interface SourceFunctio ...
- atoi、itoa,strcpy,strcmp,memcpy等实现
原文:http://www.cnblogs.com/lpshou/archive/2012/06/05/2536799.html 1.memcpy.memmove.memset源码 link:http ...
- Glide实现查看图片和保存图片到手机
两种方式, 推荐方式一 方式一 downloadOnly 创建一个 ImageActivity public class ImageActivity extends AppCompatActivity ...
- 64位Navicat Premium-11.2.7(64bit)访问64位Oracle服务器
1 在windows 10 64位操作系统安装Navicat Premium-11.2.7(64bit). 2 在服务器安装64位的Oracle(win64_11gR2_database). 3 在h ...
- Linux的inode的理解 ZZ
文件名 -> inode -> device block 转自:http://www.ruanyifeng.com/blog/2011/12/inode.htmlhttp://blog.s ...
- 关于map容器的元素被无参初始化
使用C++中的map容器定义一个mp,当你执行if语句判断mp[3]是否为1时,那么如果mp[3]以前不存在,此时mp[3]就会被无参初始化,second赋值为0. 以下的程序可以证明这一点.执行了第 ...