Как определить и использовать ENUM в Objective-C?

Я объявил перечисление в моем файле реализации, как показано ниже, и объявил переменную этого типа в моем интерфейсе как PlayerState thePlayerState; и использовал переменную в моих методах. Но я получаю ошибки, заявляя, что он не объявлен. Как правильно объявить и использовать переменную типа PlayerState в моих методах?:

В файле .m

@implementation View1Controller

    typedef enum playerStateTypes
        {
            PLAYER_OFF,
            PLAYER_PLAYING,
            PLAYER_PAUSED
        } PlayerState;

в файле .h:

@interface View1Controller : UIViewController {

    PlayerState thePlayerState;

в некотором методе в .m файле:

-(void)doSomethin{

thePlayerState = PLAYER_OFF;

}

Ответ 1

Ваш typedef должен находиться в файле заголовка (или другом файле, который #import ed в ваш заголовок), потому что иначе компилятор не будет знать, какой размер сделать PlayerState ivar. Кроме этого, мне все равно.

Ответ 2

Apple предоставляет макрос, чтобы обеспечить лучшую совместимость с кодом, включая Swift. Использование макроса выглядит следующим образом.

typedef NS_ENUM(NSInteger, PlayerStateType) {
  PlayerStateOff,
  PlayerStatePlaying,
  PlayerStatePaused
};

Документировано здесь

Ответ 3

В .h:

typedef enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
} PlayerState;

Ответ 4

В текущих проектах вы можете использовать макросы NS_ENUM() или NS_OPTIONS().

typedef NS_ENUM(NSUInteger, PlayerState) {
        PLAYER_OFF,
        PLAYER_PLAYING,
        PLAYER_PAUSED
    };

Ответ 5

Вот как Apple делает это для таких классов, как NSString:

В файле заголовка:

enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
};

typedef NSInteger PlayerState;

Обратитесь к Руководству по кодированию в http://developer.apple.com/

Ответ 6

Я рекомендую использовать NS_OPTIONS или NS_ENUM. Подробнее об этом можно прочитать здесь: http://nshipster.com/ns_enum-ns_options/

Вот пример из моего собственного кода с использованием NS_OPTIONS, у меня есть утилита, которая устанавливает подуровень (CALayer) на уровне UIView для создания границы.

h. Файл:

typedef NS_OPTIONS(NSUInteger, BSTCMBorder) {
    BSTCMBOrderNoBorder     = 0,
    BSTCMBorderTop          = 1 << 0,
    BSTCMBorderRight        = 1 << 1,
    BSTCMBorderBottom       = 1 << 2,
    BSTCMBOrderLeft         = 1 << 3
};

@interface BSTCMBorderUtility : NSObject

+ (void)setBorderOnView:(UIView *)view
                 border:(BSTCMBorder)border
                  width:(CGFloat)width
                  color:(UIColor *)color;

@end

Файл .m:

@implementation BSTCMBorderUtility

+ (void)setBorderOnView:(UIView *)view
                 border:(BSTCMBorder)border
                  width:(CGFloat)width
                  color:(UIColor *)color
{

    // Make a left border on the view
    if (border & BSTCMBOrderLeft) {

    }

    // Make a right border on the view
    if (border & BSTCMBorderRight) {

    }

    // Etc

}

@end