如何在Objective-C中使用枚举数据类型?

时间:2011-06-03 23:08:02

标签: objective-c enums

我正在开展几个iOS项目,我认为枚举数据类型对我有帮助。例如,我有一个游戏,玩家可以在几个方向走路。我可以用字符串值定义四个常量kDirectionUpkDirectionDown等等。

我认为枚举类型在这里会更好。那是对的吗?如果是这样,我如何在这里定义一个枚举,以便我以后可以比较值? (如,if(someValue == kDirectionUp){}

3 个答案:

答案 0 :(得分:13)

这听起来是正确的事情。

使用C风格的类型定义在Objective-C中创建枚举非常简单。例如,在我的一个头文件中,我有以下类型定义:

typedef enum {
  CFPosterViewTypePoster = 0,
  CFPosterViewTypeStart, // 1
  CFPosterViewTypeEnd,   // 2
  ....                   // 3
} CFPosterViewType;   

定义CFPosterViewType的对象并将其设置为以下值之一:

CFPosterViewType posterType = CFPosterViewTypeStart;

比较CFPosterViewType值时,它就像执行以下操作一样简单:

if (posterType == CFPosterViewTypePoster) {
    // do something
}

请注意,上面枚举中注释掉的数字是隐含值。如果你想做一些不同的事情,比如说,定义一个位掩码,或者你需要的值与默认值不同,你需要明确定义它们。

答案 1 :(得分:5)

在头文件中,定义enum类型,例如:

// SomeHeaderFile.h
typedef enum {
    MOPlayerDirectionNone,
    MOPlayerDirectionUp,
    MOPlayerDirectionDown,
    …
} MOPlayerDirection;

每当您需要使用MOPlayerDirection#import该头文件时。然后,您可以将其用作类型及其可能的值。

例如:

#import "SomeHeaderFile.h"

@interface MOPlayer : NSObject {
    MOPlayerDirection currentDirection;
}

- (void)moveToDirection:(MOPlayerDirection)direction;
- (void)halt;
@end

#import "SomeHeaderFile.h"
#import "MOPlayer.h"

@implementation MOPlayer

- (id)init {
    self = [super init];
    if (self) {
        currentDirection = MOPlayerDirectionNone;
    }
    return self;
}

- (void)moveToDirection:(MOPlayerDirection)direction {
    currentDirection = direction;

    switch (currentDirection) {
        case MOPlayerDirectionUp:
            // do something
            break;

        case MOPlayerDirectionDown:
            // do something
            break;
    }
}

- (void)halt {
    if (currentDirection != MOPlayerDirectionNone) {
        // do something
        currentDirection = MOPlayerDirectionNone;
    }
}

@end

如果枚举与类紧密相关,则通常在与类声明相同的头文件中定义它。在上面的示例中,您可以在MOPlayer.h中定义它,而不是在SomeHeaderFile.h中定义MOPlayerDirection

答案 2 :(得分:2)

只需在文件顶部定义它们:

enum    // direction types
{
    kDirectionUp = 0,
    kDirectionDown, // 1
    kDirectionLeft, // 2
    kDirectionRight // 3

};

然后你可以按要求打电话:

if(someValue == kDirectionUp){ // do something }