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 ...
随机推荐
- 实现移动端touch事件的横向滑动列表效果
要实现手机端横向滑动效果并不难,了解实现的原理及业务逻辑就很容易实现.原理:touchstart(手指按下瞬间获取相对于页面的位置)——>touchmove(手指移动多少,元素相应移动多少). ...
- Codeforces Round #413 A. Carrot Cakes
A. Carrot Cakes time limit per test 1 second memory limit per test 256 megabytes In some game ...
- API——SendMessageTimeout
原文:http://www.cnblogs.com/lzjsky/articles/1777848.html 函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,并且,如 ...
- C# 3.0-c#5.0 变化
最近发现对于C#的使用水平一只停留在3.0的程度 对于4.0 5.0的新特性使用的很少,写一篇文章记录一下增加一下认识. C# 3.5 扩展方法 扩展方法所在的类和扩展方法必须是静态的 并且扩展方法第 ...
- Android错题集
在Android学习的过程中,遇到过很多迷之问题,在这里记下以防以后忘记,也可以顺便帮助一下遇到了相同问题的朋友. 1.自定义控件文字大小错误: 在自定义控件中获取的getDimension值为px值 ...
- Android已上线应用开源分享中(第一季)
这是我上线的第一个android应用,在百度.腾讯.豌豆荚等平台测试通过,也有了部分用户,还是可以的啊,哈哈.现在分享给大家,当然,源码我也会分享. 1.软件是一个管理wifi的小工具 (1)查询.连 ...
- 爬虫入门之Scrapy 框架基础功能(九)
Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非 ...
- UIButton中的**EdgeInsets是做什么用的?
UIButton中的**EdgeInsets是做什么用的? UIEdgeInsetsMake Creates an edge inset for a button or view.An inset i ...
- Python学习---Python下[列表]的学习
列表[list]用中括号[]表示,处理一组有序项目的数据结构,列表的类型是可变的数据类型,类型是list 列表是可变/线程不安全的 # type(a) = list 利用type判断元素离线 # 切 ...
- python功能代码块记录
python Autopep8——按PEP8风格自动排版Python代码(参考链接) autopep8 --in-place --aggressive --aggressive test_autope ...