博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
正确的使用枚举(Enum)
阅读量:6257 次
发布时间:2019-06-22

本文共 1922 字,大约阅读时间需要 6 分钟。

状态与选项的区别(states and options)

在用enum之前,我个人觉得,区分一下状态和选项的概念还是很必要的。

状态,同时只能有一种,如“OK”,“Error”,不可能同时是OK和Error。

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

接下来,我们看看如何用枚举定义状态和选项。

enum与状态(states)

typedef enum _TTGState {    TTGStateOK  = 0,    TTGStateError,    TTGStateUnknow} TTGState;//指明枚举类型TTGState state = TTGStateOK;

用的时候就如下:

- (void)dealWithState:(TTGState)state {    switch (state) {        case TTGStateOK:            //...            break;        case TTGStateError:            //...            break;        case TTGStateUnknow:            //...            break;    }}

enum与选项 (options)

选项,就是说一个“选项变量”的类型要能够同时表示一个或多个组合的选择,如下例子:

//方向,可同时支持一个或多个方向typedef enum _TTGDirection {    TTGDirectionNone = 0,    TTGDirectionTop = 1 << 0,    TTGDirectionLeft = 1 << 1,    TTGDirectionRight = 1 << 2,    TTGDirectionBottom = 1 << 3} TTGDirection;

 

看,这里的选项是用位运算的方式定义的,这样的好处就是,我们的选项变量可以如下表示:

//用“或”运算同时赋值多个选项TTGDirection direction = TTGDirectionTop | TTGDirectionLeft | TTGDirectionBottom;//用“与”运算取出对应位if (direction & TTGDirectionTop) {    NSLog(@"top");}if (direction & TTGDirectionLeft) {    NSLog(@"left");}if (direction & TTGDirectionRight) {    NSLog(@"right");}if (direction & TTGDirectionBottom) {    NSLog(@"bottom");}

 

 

direction变量的实际内存如下:

这样,用位运算,就可以同时支持多个值。

enum在Objective-C中的“升级版”

一般来说,我们不能指定枚举变量的实际类型是什么,就是说,我们不知道枚举最后是int型,还是其他的什么类型。但是从C++ 11开始,我们可以为枚举指定其实际的存储类型,如下语法:

enum TTGState : NSInteger {
/*...*/};

 

但是,我们在定义枚举的时候如何保证兼容性呢?Foundation框架已经为我们提供了更加“统一、便捷”的枚举定义方法,我们重新定义上面的例子:

//NS_ENUM,定义状态等普通枚举typedef NS_ENUM(NSUInteger, TTGState) {    TTGStateOK = 0,    TTGStateError,    TTGStateUnknow};//NS_OPTIONS,定义选项typedef NS_OPTIONS(NSUInteger, TTGDirection) {    TTGDirectionNone = 0,    TTGDirectionTop = 1 << 0,    TTGDirectionLeft = 1 << 1,    TTGDirectionRight = 1 << 2,    TTGDirectionBottom = 1 << 3};

 

所以,在开发Mac、iOS程序中,最好所有的枚举都用“NS_ENUM”和“NS_OPTIONS”定义,保证统一。

总结

充分的用好枚举,可以增强代码的可读性,减少各种“错误”,让代码更加的规范。

转载地址:http://xcxsa.baihongyu.com/

你可能感兴趣的文章
【vue.js】绑定click事件
查看>>
字体属性
查看>>
linux的iptables和firewall的区别
查看>>
Install RabbitMQ server in CentOS 7
查看>>
Eureka的优势
查看>>
Android项目实战(一): SpannableString与SpannableStringBuilder
查看>>
idea中的language level 介绍
查看>>
CTSC 2018酱油记
查看>>
php框架排名(Laravel一直第一)
查看>>
行贿罪、受贿罪刑事辩护6大要点
查看>>
java日期格式(年月日时分秒毫秒)
查看>>
看懂UML类图
查看>>
c#串口编程(转)
查看>>
OpenMVG学习笔记
查看>>
Ubuntu下 fatal error: Python.h: No such file or directory 解决方法
查看>>
微信小程序 (node) warning: possible EventEmitter memory leak detected
查看>>
写给大忙人的spring cloud 1.x学习指南
查看>>
mycat->oracle报java.sql.SQLException: 无法从套接字读取更多的数据
查看>>
游戏开发中IIS常见支持MIME类型文件解析
查看>>
Idea下Android的配置
查看>>