iOS 高级开发技巧 1.熟悉Objective-C (五) 用枚举表示状态、选项、状态码

来源:互联网 发布:java编程实例及讲解 编辑:程序博客网 时间:2024/06/13 09:22

用枚举表示状态、选项、状态码


前面说过一个问题就是objective-c是基于c语言的,所以c语言有的功能它都有。

其中之一就是枚举:enum

在系统中我们使用过很多这样的类型,比如:

UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];

UIButtonType 就是一个枚举,它的定义是这样的:

typedef NS_ENUM(NSInteger, UIButtonType) {    UIButtonTypeCustom = 0,                         // no button type    UIButtonTypeSystem NS_ENUM_AVAILABLE_IOS(7_0),  // standard system button    UIButtonTypeDetailDisclosure,    UIButtonTypeInfoLight,    UIButtonTypeInfoDark,    UIButtonTypeContactAdd,        UIButtonTypeRoundedRect = UIButtonTypeSystem,   // Deprecated, use UIButtonTypeSystem instead};

————————————————分割线——————————————————————

枚举我们在什么时候使用比较好呢?

举个栗子吧,比如我们在做一个快递状态的区分的时候,也许文档中会说明:

status = 0 代表没有查到 、1 代表已入库、2 代表已出库、3 代表正在运送中、 4 代表已签收

在编码初期,我们也许会在传送这个状态的时候用01234传送

如果你知道 #define 预处理命令 或者 类型常量, 也许你会定义这样的来写。

可是这些都不是最好的,从写代码的意义来说,前面的两种方式都不是最能让人一眼看出的

这个时候就用到enum 枚举了。

c语言的枚举就不说了,有兴趣的孩子可以去google看看相关资料,它用起来比较(注意!仅仅是比较)麻烦。

oc 使用宏定义将其简化了:

//快递状态typedef NS_ENUM(int, MailSendStatus){    MailSendStatusNotFound = 0,                      //没有查到    MailSendStatusInStore = 1,                       //已入库    MailSendStatusOutStore = 2,                      //已出库    MailSendStatusSending = 3,                       //正在运送中    MailSendStatusReceived = 4,                      //已签收};

像上面这样的方式就可以定义一个枚举了。可以用如下方式定义。

MailSendStatus status = MailSendStatusSending;

当然也可以直接使用:

if (MailSendStatusSending){//bulabulabulabula....}

当然,这样的定义是在每一个状态是两两独立的情况下

例如一件快递不会即是已入库又是正在运送中的状态。

但是某些时候的状态不一定是这样的,比如一个程序员掌握的技术

可以有C,C++,Objective-C,PHP,Ruby等。这个不是单一的,一个程序员这些东西都会也不是件稀奇的事情。

我们可以用枚举来确定这些东西。

//程序员掌握的技能NS_OPTIONS(NSUInteger, ProgrammerSkill){ProgrammerSkillC = 1<< 0,   ProgrammerSkillCPlus = 1 << 1,ProgrammerSkillObjectiveC = 1 << 2,ProgrammerSkillPHP = 1 << 3,ProgrammerSkillRuby = 1 << 4}

当然我们如何使用它呢?比如我们做一个面试代码,如果一个程序员会C、C++、objective-c,那么就录用:

ProgrammerSkill skill = ProgrammerSkillC |  ProgrammerSkillCPlus | ProgrammerSkillObjectiveC;if (yourSkill == skill){//bulabulabula....}

介绍一种巧妙的东西,就是switch与这个合体!!

ProgrammerSkill skill;    switch (skill) {        ProgrammerSkillC:                        break;        ProgrammerSkillObjective:                        break;        ProgrammerSkillPHP:                        break;        ProgrammerSkillRuby:                    break;        case ProgrammerSkillC | ProgrammerSkillCPlus | ProgrammerSkillObjectiveC:            //就是你了!!            break;                default:            break;    }


打完收工!

要点

- 应该用枚举来表示状态机的状态、传递给方法的区分选项以及状态等值,记得给他们起个容易理解的名字。

- switch + enum 好搭档!




0 0
原创粉丝点击