前言

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(选项)?

  1. 苹果推荐。
  2. 大家都这样写。
  3. 其他的不好学。
  4. 以上的都不重要,看我的证明就行了

状态的表示姿势

错误姿势

 
 
 
 
 

Objective-C

 
1
2
3
4
5
6
#define UIScrollViewKeyboardDismissModeNone 0
#define UIScrollViewKeyboardDismissModeOnDrag 1          
#define UIScrollViewKeyboardDismissModeInteractive 2
 
// 接收值就得这样:
int UIScrollViewKeyboardDismissMode = UIScrollViewKeyboardDismissModeNone;

为什么这样做不好:

  1. 宏定义没有类型约束,只是单纯的替换。
  • 可读性较差。
  • 可以用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宏的更多相关文章

  1. iOS一分钟学会环形进度条

    有几篇博客写到了怎么实现环形进度条,大多是使用Core Graph来实现,实现比较麻烦且效率略低,只是一个小小的进度条而已,我们当然是用最简单而且效率高的方式来实现.先看一下这篇博客,博客地址:htt ...

  2. 5分钟学会使用Less预编译器

    5分钟学会使用Less预编译器 Less是什么? LESS CSS是一种动态样式语言,属于CSS预处理语言的一种,它使用类似CSS的语法为CSS赋予了动态语言的特性,如变量.继承.运算.函数等,更方便 ...

  3. 《量化投资:以MATLAB为工具》连载(2)基础篇-N分钟学会MATLAB(中)

    http://www.matlabsky.com/thread-43937-1-1.html   <量化投资:以MATLAB为工具>连载(3)基础篇-N分钟学会MATLAB(下)     ...

  4. 【grunt第二弹】30分钟学会使用grunt打包前端代码(02)

    前言 上一篇博客,我们简单的介绍了grunt的使用,一些基础点没能覆盖,我们今天有必要看看一些基础知识 [grunt第一弹]30分钟学会使用grunt打包前端代码 配置任务/grunt.initCon ...

  5. 《量化投资:以MATLAB为工具》连载(1)基础篇-N分钟学会MATLAB(上)

    http://blog.sina.com.cn/s/blog_4cf8aad30102uylf.html <量化投资:以MATLAB为工具>连载(1)基础篇-N分钟学会MATLAB(上) ...

  6. [分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例)

    [分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例) 踏雁寻花 发表于 2015-8-23 23:31:28 https://www.itsk.com/thread-35 ...

  7. 50分钟学会Laravel 50个小技巧

    50分钟学会Laravel 50个小技巧 时间 2015-12-09 17:13:45  Yuansir-web菜鸟 原文  http://www.yuansir-web.com/2015/12/09 ...

  8. 10分钟学会Linux

    10分钟学会Linux有点夸张,可是能够让一个新手初步熟悉Linux中最重要最主要的知识,本文翻译的英文网页在众多Linux入门学习的资料中还是很不错的. 英文地址:http://freeengine ...

  9. PHP学习过程_Symfony_(3)_整理_十分钟学会Symfony

    这篇文章主要介绍了Symfony学习十分钟入门教程,详细介绍了Symfony的安装配置,项目初始化,建立Bundle,设计实体,添加约束,增删改查等基本操作技巧,需要的朋友可以参考下 (此文章已被多人 ...

随机推荐

  1. 两个div并列居中显示——当display:inline-block;时,两个div无法对齐即一高一矮

    解决办法: 给div添加样式vertical-align: top;

  2. jsp另外五大内置对象之response-设置头信息

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  3. 使Win10用户获得特殊权限以便删除相应文件(夹)

    依次访问: 本地用户和组(右击“此电脑”): 用户: 右击:当前用户名: 属性: 添加: 输入:System Managed Accounts Group: 检查名称(可选): 确定: 重启电脑. 参 ...

  4. java基础——Map集合

    Map以键值对的形式存储数据,其中Map.entry,是Map的内部类,它用来描述Map中的键值对.Map是一个接口,HashMap是他的一个实现类 Map中有几个重要的方法: get(Object ...

  5. LINQ结合正则表达式查询文件系统

    string startFolder = @"D:\Program Files (x86)\Microsoft Visual Studio 12.0\"; IEnumerable& ...

  6. 解决cocos2dx 3.x 导入cocostudio的ui界面出现错位问题

    笔者今天发现导入cocostudio的ui界面时,会有部分控件出现错位的现象,后来我看了一下源码,发现是部分控件是没有继承 Layout类,导致不能设置控件位置造成,原因可以看看cocos2dx 源码 ...

  7. 初识Mysql之基本简单语法总结

    一.  DDL(data definition language)语句:数据定义语言. 这些语句定义了不同的数据段.数据库.表.列.索引等数据库对象.常用语句关键字:create.drop.alter ...

  8. jQuery 淡入淡出有png图的时候 ie8下有黑色边框

    jQuery fadeTo 时ie8 png图片有黑色边框 往带有png图的样式里加 filter:progid:DXImageTransform.Microsoft.AlphaImageLoader ...

  9. 【Windows7注册码】

    [文章转载自 http://www.win7zhijia.cn/jiaocheng/win7_19324.html] 一.神Key: KH2J9-PC326-T44D4-39H6V-TVPBY TFP ...

  10. Python入门学习笔记2:刷题

    1) LeetCode 强的面试题和算法题,要求也比较高,很多国内外的码农在上面刷题.难度从easy到hard都有,而且覆盖面极广,需要你的综合实力去答题. 最简单的题比如字符串的处理有的时候也要用到 ...