OC中枚举的使用
———- android培训、java培训、期待与您交流! ———-
前言
由于Objective-C是C语言的超集,所以在OC程序中一般的常量表示也有宏定义 以及const 变量类型 变量 和枚举等形式,这里我们介绍些枚举的几种适用场合
用枚举表示一个操作的不同状态
我们随便举个例子,比如说你想跟别人通过短信息聊天而需要发送信息给对方,这个时候我们需要一组该动作相关联的状态码来表示我们发送信息这一操作中的各个状态(没发送、 发送中、和发送完 我们暂且就分为这三个简单的状态)从技术层面上来说我们的确可以采用宏定义或者是const变量的形式
- 先来说下宏定义
// 宏定义
#define MESSAGE_STATE_DISSEND 0
#define MESSAGE_STATE_SENDING 1
#define MESSAGE_STATE_SENDED 2
// 枚举
typedef enum MESSAGE_STATE{
MESSAGE_STATE_DISSEND,
MESSAGE_STATE_SENDING,
MESSAGE_STATE_SENDED,
}MESSAGE_STATE;
从上面给出的代码说明了很重要的一点:
宏定义的形式没有枚举简洁
而且我们都知道:
宏定义本身在开发中有这样的问题,就是不同的开发者有可能在彼此不知道的情况下定义了相同的宏并且值可能不同,这个时候编译器并不会报错和产生警告信息!这是不能容忍的!
- 在看const
// oneclass.m
static NSNumber *const MESSAGE_STATE_DISSEND = @0;
static NSNumber *const MESSAGE_STATE_SENDING = @1;
static NSNumber *const MESSAGE_STATE_SENDED = @2;
从代码的表现形式我们知道使用static const的形式解决了状态常量被重写的问题但是很明显他没有枚举简洁
用枚举编译器会自动为枚举分配一个独有的编号从0开始依次递增1,而且采用枚举更能体现这是一组相关联的状态
状态组合使用枚举
我们在定义一组可自由拼凑状态的时候是用枚举是更为合适的,我来举个简单的例子:
假如我们要为生产手机挑选一组功能怎么做呢?
// 定义枚举
typedef enum NEW_PHONE_MODULE{
NEW_PHONE_MODULE_PLAY_MUSIC = 1 << 0,
NEW_PHONE_MODULE_RECORDING = 1 << 1,
NEW_PHONE_MODULE_SEND_MESSAGE = 1 << 2,
}NEW_PHONE_MODULE;
NEW_PHONE_MODULE new_phone_module = NEW_PHONE_MODULE_PLAY_MUSIC |
NEW_PHONE_MODULE_RECORDING | NEW_PHONE_MODULE_SEND_MESSAGE;
// 使用组合(这里当手机具有播放音乐的功能就打印信息)
if(new_phone_module & NEW_PHONE_MODULE_PLAY_MUSIC)
{
NSLog(@"新手机有播放音乐的功能!");
}
switch中使用枚举
MESSAGE_STATE state = MESSAGE_STATE_SENDING;
switch (state)
{
MESSAGE_STATE_DISSEND:
NSLog(@"未发送");
break;
MESSAGE_STATE_SENDING:
NSLog(@"发送中");
break;
MESSAGE_STATE_SENDED:
NSLog(@"已发送");
break;
}
这里需要注意的是,不要有switch语句中的default分支,因为一旦我们添加新的状态了在switch语句中没处理的话在没有default情况下编译器就能够发现,而有了default分支他就会自动处理该状态这是我们不愿意看到的。