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

Mos*_*she 11 enums objective-c

我正在研究几个iOS项目,我认为枚举数据类型对我有帮助.例如,我有一个游戏,玩家可以在几个方向走路.我可以只定义四个常量字符串值作为kDirectionUp,kDirectionDown等等.

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

csa*_*ano 13

这听起来是正确的事情.

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

typedef enum {
  CFPosterViewTypePoster = 0,
  CFPosterViewTypeStart, // 1
  CFPosterViewTypeEnd,   // 2
  ....                   // 3
} CFPosterViewType;   
Run Code Online (Sandbox Code Playgroud)

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

CFPosterViewType posterType = CFPosterViewTypeStart;
Run Code Online (Sandbox Code Playgroud)

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

if (posterType == CFPosterViewTypePoster) {
    // do something
}
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

// SomeHeaderFile.h
typedef enum {
    MOPlayerDirectionNone,
    MOPlayerDirectionUp,
    MOPlayerDirectionDown,
    …
} MOPlayerDirection;
Run Code Online (Sandbox Code Playgroud)

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

例如:

#import "SomeHeaderFile.h"

@interface MOPlayer : NSObject {
    MOPlayerDirection currentDirection;
}

- (void)moveToDirection:(MOPlayerDirection)direction;
- (void)halt;
@end
Run Code Online (Sandbox Code Playgroud)

和:

#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
Run Code Online (Sandbox Code Playgroud)

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