iOS-----5分钟学会枚举的正确使用姿势-Enumeration宏
前言
Enum,枚举,相信大部分编程语言都有对应的枚举类型,功能可能有多有少,但是枚举最核心的功能是 “规范的定义代码中的状态、状态码、选项”。
状态、状态码、选项
什么是状态:同时只能出现一个值(状态码就是他的值),比如这个ScrollView里的枚举:
Objective-C
|
1
2
3
4
5
|
typedef NS_ENUM(NSInteger, UIScrollViewKeyboardDismissMode) {
UIScrollViewKeyboardDismissModeNone,
UIScrollViewKeyboardDismissModeOnDrag,
UIScrollViewKeyboardDismissModeInteractive
};
|
什么是选项:同时可以出现一个或多个值:
Objective-C
|
1
2
3
4
5
6
7
8
9
|
typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
UIViewAutoresizingNone = 0,
UIViewAutoresizingFlexibleLeftMargin = 1 << 0,
UIViewAutoresizingFlexibleWidth = 1 << 1,
UIViewAutoresizingFlexibleRightMargin = 1 << 2,
UIViewAutoresizingFlexibleTopMargin = 1 << 3,
UIViewAutoresizingFlexibleHeight = 1 << 4,
UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};
|
为什么要使用NS_ENUM(状态) 和 NS_OPTIONS(选项)?
- 苹果推荐。
- 大家都这样写。
- 其他的不好学。
- 以上的都不重要,看我的证明就行了。
状态的表示姿势
错误姿势
Objective-C
|
1
2
3
4
5
6
|
#define UIScrollViewKeyboardDismissModeNone 0
#define UIScrollViewKeyboardDismissModeOnDrag 1
#define UIScrollViewKeyboardDismissModeInteractive 2
// 接收值就得这样:
int UIScrollViewKeyboardDismissMode = UIScrollViewKeyboardDismissModeNone;
|
为什么这样做不好:
- 宏定义没有类型约束,只是单纯的替换。
- 可读性较差。
- 可以用int也可以用UIInteger来接收。
正确姿势
Objective-C
|
1
2
3
4
5
6
7
8
|
typedef enum {
UIScrollViewKeyboardDismissModeNone = 0,
UIScrollViewKeyboardDismissModeOnDrag,
UIScrollViewKeyboardDismissModeInteractive
} UIScrollViewKeyboardDismissMode;
// 指明枚举类型
UIScrollViewKeyboardDismissMode mode = UIScrollViewKeyboardDismissModeNone;
|
用起来就是这样的:
Objective-C
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
- (void)dealWithMode:(UIScrollViewKeyboardDismissMode)mode {
switch (mode) {
case UIScrollViewKeyboardDismissModeNone:
//...
break;
case UIScrollViewKeyboardDismissModeOnDrag:
//...
break;
case UIScrollViewKeyboardDismissModeInteractive:
//...
break;
}
}
|
这样枚举解决了上面1和2的缺点,但是第3点还是没有解决,我依然可以这样搞:
Objective-C
|
1
2
3
|
int mode = UIScrollViewKeyboardDismissModeNone;
// or
UIInteger mode = UIScrollViewKeyboardDismissModeNone;
|
完美姿势
NS_ENUM是枚举在Objective-C中的”升级版”,改进后代码如下:
Objective-C
|
1
2
3
4
5
|
typedef NS_ENUM(NSInteger, UIScrollViewKeyboardDismissMode) {
UIScrollViewKeyboardDismissModeNone,
UIScrollViewKeyboardDismissModeOnDrag,
UIScrollViewKeyboardDismissModeInteractive
};
|
代码很简单,不理解的话可以评论求解答。
选项的使用姿势
如果有一个”选项变量”要同时表示一个或者多个值肿么办?这时就得上我们的NS_OPTIONS了。
比如有这样一个简单的例子:
Objective-C
|
1
2
3
4
5
|
typedef NS_OPTIONS(NSUInteger, JZZPersonType) {
JZZPersonTypeHigh = 0,
JZZPersonTypeRich = 1 << 0,
JZZPersonTypePretty = 1 << 1
};
|
可以看到,我们这里的选项是用的位运算的方式定义的,这样的好处就是我们的选项变量可以这样来表示:
Objective-C
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// 用“或|”运算同时赋值多个选项
JZZPersonType personType = JZZPersonTypeHigh | JZZPersonTypeRich | JZZPersonTypePretty;
// 用“与&”运算取出对应位
if (personType & JZZPersonTypeHigh) {
NSLog(@"高");
}
if (personType & JZZPersonTypeRich) {
NSLog(@"富");
}
if (personType & JZZPersonTypePretty) {
NSLog(@"帅");
}
|
“|”赋值完后,富帅的内心(内存)其实是长这样的:

iOS-----5分钟学会枚举的正确使用姿势-Enumeration宏的更多相关文章
- iOS一分钟学会环形进度条
有几篇博客写到了怎么实现环形进度条,大多是使用Core Graph来实现,实现比较麻烦且效率略低,只是一个小小的进度条而已,我们当然是用最简单而且效率高的方式来实现.先看一下这篇博客,博客地址:htt ...
- 5分钟学会使用Less预编译器
5分钟学会使用Less预编译器 Less是什么? LESS CSS是一种动态样式语言,属于CSS预处理语言的一种,它使用类似CSS的语法为CSS赋予了动态语言的特性,如变量.继承.运算.函数等,更方便 ...
- 《量化投资:以MATLAB为工具》连载(2)基础篇-N分钟学会MATLAB(中)
http://www.matlabsky.com/thread-43937-1-1.html <量化投资:以MATLAB为工具>连载(3)基础篇-N分钟学会MATLAB(下) ...
- 【grunt第二弹】30分钟学会使用grunt打包前端代码(02)
前言 上一篇博客,我们简单的介绍了grunt的使用,一些基础点没能覆盖,我们今天有必要看看一些基础知识 [grunt第一弹]30分钟学会使用grunt打包前端代码 配置任务/grunt.initCon ...
- 《量化投资:以MATLAB为工具》连载(1)基础篇-N分钟学会MATLAB(上)
http://blog.sina.com.cn/s/blog_4cf8aad30102uylf.html <量化投资:以MATLAB为工具>连载(1)基础篇-N分钟学会MATLAB(上) ...
- [分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例)
[分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例) 踏雁寻花 发表于 2015-8-23 23:31:28 https://www.itsk.com/thread-35 ...
- 50分钟学会Laravel 50个小技巧
50分钟学会Laravel 50个小技巧 时间 2015-12-09 17:13:45 Yuansir-web菜鸟 原文 http://www.yuansir-web.com/2015/12/09 ...
- 10分钟学会Linux
10分钟学会Linux有点夸张,可是能够让一个新手初步熟悉Linux中最重要最主要的知识,本文翻译的英文网页在众多Linux入门学习的资料中还是很不错的. 英文地址:http://freeengine ...
- PHP学习过程_Symfony_(3)_整理_十分钟学会Symfony
这篇文章主要介绍了Symfony学习十分钟入门教程,详细介绍了Symfony的安装配置,项目初始化,建立Bundle,设计实体,添加约束,增删改查等基本操作技巧,需要的朋友可以参考下 (此文章已被多人 ...
随机推荐
- JavaScript_10_错误
Try...catch... throw <!DOCTYPE html> <html> <head> <title></title> < ...
- ES6, Angular,React和ABAP中的String Template(字符串模板)
String Template(字符串模板)在很多编程语言和框架中都支持,是一个很有用的特性.本文将Jerry工作中使用到的String Template的特性做一个总结. ES6 阮一峰老师有一个专 ...
- Intel 快速存储蓝屏
今天电脑蓝屏,DPC Watchdog Violation 很烦.开bluescreen说是NT内核的问题 开windbg说是Intel快速存储的问题,顺手卸载快速存储 卸载前 卸载后 另外我看Int ...
- UVA11090 Going in Cycle (二分+判负环)
二分法+spfa判负环.如果存在一个环sum(wi)<k*x,i=0,1,2...,k,那么每条边减去x以后会形成负环.因此可用spfa来判负环. 一般spfa判负环dfs最快,用stack次之 ...
- HDU 5097 Page Rank (模拟)
题目背景是以前用来对网页进行排名的Page Rank算法,是早期Google的革命性发明. 背后的原理是矩阵和图论.这个数学模型是由Google的创始人拉里·佩奇和谢尔盖·布林发现的. 如果一个网页被 ...
- 【转】iOS-生成Bundle包-引入bundle-使用bundle
在我们使用第三方框架时,常常看到XXX.bundle的文件. 我们找到该文件,显示包内容,大致看到很多资源文件:图片.配置文本.XIB文件…… 什么是Bundle文件? 简单理解,就是资源文件包. ...
- ECshop安装提示cls_image::gd_version() 和不支持JPEG
ecshop版本:ECShop_V2.7.3_UTF8_release1106php 版本 5.5--------------------------------------------------- ...
- k8s搭建WebUI--Dashborad管理界面
k8s的webUI管理界面可以更好更直观更便捷的让我们去管理我们的k8s集群. 我们知道,由于某些原因我们无法直接拉取dashboard的镜像,但是国内有些人已经将镜像下载到dockerhub中可以给 ...
- docker镜像下载
获得CentOS的Docker CE 预计阅读时间: 10分钟 要在CentOS上开始使用Docker CE,请确保 满足先决条件,然后 安装Docker. 先决条件 Docker EE客户 要安装D ...
- Linux下配置Django_Apache_Mysql环境(CentOS 7.5)
本文将介绍如何在Linux上部署Django + Mysql + Apache环境.我们知道,Django内置的http服务器只能工作在单线程下,做开发和调试时候是可以的,但是生产环境通常都会有多用户 ...