Objective-C和Sprite Kit游戏开发从入门到精通
上QQ阅读APP看书,第一时间看更新

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中的枚举值是整数,如果需要保存到文件或数据库中,应使用整数类型。