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

11

我正在开发一些iOS项目,认为枚举数据类型对我会很有帮助。例如,我有一个游戏,玩家可以向多个方向行走。我可以定义四个带字符串值的常量,如kDirectionUpkDirectionDown等。

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

3个回答

13

听起来是正确的做法。

使用 C 风格的类型定义可以很容易地在 Objective-C 中创建枚举。例如,在我的一个头文件中,我有以下类型定义:

typedef enum {
  CFPosterViewTypePoster = 0,
  CFPosterViewTypeStart, // 1
  CFPosterViewTypeEnd,   // 2
  ....                   // 3
} CFPosterViewType;   
您可以定义一个CFPosterViewType对象并将其设置为以下值之一:
CFPosterViewType posterType = CFPosterViewTypeStart;

比较CFPosterViewType值就像这样简单:

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

请注意上面枚举中被注释掉的数字是隐式值。如果你想要做一些不同的事情,比如定义一个位掩码或者其他任何需要与默认值不同的值的情况下,您需要显式地定义它们。


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

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

我认为 MOPlayerDirection *currentDirection 应该改为 MOPlayerDirection currentDirection ;-). 这里可能没有什么区别,但是较新的做法似乎是在枚举之后显式添加 typedef NSUInteger MOPlayerDirection; 来帮助编译器进行处理。 - NSGod
@NSGod 谢谢;自动驾驶光速。 :) - user557219
@NSGod 我不太明白 NSUInteger 如何帮助编译器。编译器可以自由选择 enum 的底层数据类型,而该数据类型保证是整数数据类型之一。 - user557219
虽然对于位掩码枚举来说这是正确的。 - user557219

2
只需在文件顶部定义它们即可:
enum    // direction types
{
    kDirectionUp = 0,
    kDirectionDown, // 1
    kDirectionLeft, // 2
    kDirectionRight // 3

};

那么您可以根据需要进行调用:
if(someValue == kDirectionUp){ // do something }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接