您的位置:首页 > 移动开发 > Objective-C

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

2014-11-25 18:49 525 查看
用枚举表示状态、选项、状态码

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

其中之一就是枚举:enum

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

UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];


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

typedef NS_ENUM(NSInteger, UIButtonType) {
    UIButtonTypeCustom = 0,                         // no button type
    UIButtonTypeSystem NS_ENUM_***AILABLE_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 好搭档!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: