Как использовать перечисляемые типы данных в Objective-C? - PullRequest
11 голосов
/ 04 июня 2011

Я работаю над несколькими iOS-проектами, где я думаю, что перечисленные типы данных были бы полезны для меня.Например, у меня есть игра, в которой игрок может идти в нескольких направлениях.Я мог бы просто определить четыре константы со строковыми значениями как kDirectionUp, kDirectionDown и т. Д.

Я думаю, что перечислимый тип был бы лучше здесь.Это верно?Если да, то как мне определить здесь перечисление, чтобы потом можно было сравнивать значения?(Как в if(someValue == kDirectionUp){})

Ответы [ 3 ]

13 голосов
/ 04 июня 2011

Это звучит как то, что нужно делать.

В Objective-C очень просто создавать перечисления с использованием определений типов в стиле C.Например, в одном из моих заголовочных файлов у меня есть следующее определение типа:

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

Вы определяете объект CFPosterViewType и устанавливаете для него одно из значений:

CFPosterViewType posterType = CFPosterViewTypeStart;

При сравнении значений CFPosterViewType это так же просто, как сделать следующее:

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

Обратите внимание, что закомментированные числа в перечислении выше являются неявными значениями.Если вы хотите сделать что-то по-другому, скажем, определить битовую маску или что-то еще, где вы хотите, чтобы значения отличались от значений по умолчанию, вам нужно явно определить их.

5 голосов
/ 04 июня 2011

В заголовочном файле определите тип 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 в SomeHeaderFile.h вы можете определить его в MOPlayer.h.

2 голосов
/ 04 июня 2011

Просто определите их в верхней части вашего файла:

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

};

тогда можно звонить по мере необходимости:

if(someValue == kDirectionUp){ // do something }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...