2.13 枚举
接下来,我们思考一个简单点的问题,对于数值数据可以使用整数或浮点数,对于“开/关”类数据可以使用布尔型,对于文本信息可以使用字符或字符串,那么,对于性别这样的数据,使用什么数据类型比较合适呢?
想正确地处理一类数据,就必须清楚这类数据的值可能有哪些?就说性别吧,大家都知道,包括男和女。不过,还有一种情况,如果有人想对自己的性别保密呢?好吧,那性别数据就有可能有三种基本的数值了,包括:保密、男和女。
那么,我们使用什么类型保存性别数据呢?理论上讲会有很多方案,比如,使用宏,如下面的代码。
#define SEX_UNKNOW 0 #define SEX_MALE 1 #define SEX_FEMALE 2
或者定义常量,如下面的代码。
const int SexUnknow = 0; const int SexMale = 1; const int SexFemale = 2;
不过,如果能够定义一个性别类型是不是会更加直观呢?好的,我们马上使用enum关键字定义枚举类型,如下面的代码就定义了一个性别枚举类型。
enum ESex {Unknow, Male, Female};
然后,我们使用如下代码来使用这个类型。
enum ESex tomSex = Male;
我们可以看到,在定义性别类型的变量时,同样使用了enum关键字。不过,为了更方便地使用枚举类型,我们也可以使用typedef关键字定义它的别名。此时,我们可以单独定义,也可以在定义ESex枚举类型时直接定义。
typedef enum ESex Sex;
或:
typedef enum ESex {Unknow, Male, Female} Sex;
然后,我可以直接使用Sex类型来定义变量。
Sex tomSex = Male; NSLog(@"%i", tomSex);
当我们需要显示枚举变量(如tomSex)的值时,只能使用整数来显示,其中,枚举类型中定义的第一个成员值为0,第二个成员值为1,第三个成员值为2,以此类推。当然,如果需要自己指定枚举成员的值也是可以的,如下面的代码。
typedef enum ESex {Unknow = 0, Male = 1, Female = 2} Sex;
此外,枚举成员的值也可以不从0开始,但我们并不建议这样使用,除非项目中的数据真的不允许为0。如下面定义的太空门枚举类型。
typedef enum ESpaceGate { EarthGate = 300, MoonGate = 301, MarsGate = 400, PlanetIGate = 9000 } SpaceGate;
最后,在使用枚举类型时应注意一些问题:
❑ 总是保留一个未知(Unknow)的枚举项是一种安全措施,这样可以保证在任何时候都能够处理意外数据,比如,突然出现了一个可以到达异次元空间的太空门,或者真的出现了雌雄同体。
❑ 在Objective-C中的枚举值是整数,如果需要保存到文件或数据库中,应使用整数类型。