用枚举表示状态、选项、状态码
前面说过一个问题就是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 好搭档!