Как определить и использовать ENUM в Objective-C? - PullRequest
181 голосов
/ 06 февраля 2010

Я объявил enum в своем файле реализации, как показано ниже, и объявил переменную этого типа в моем интерфейсе как 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;

}

Ответы [ 6 ]

205 голосов
/ 14 октября 2012

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

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

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

109 голосов
/ 06 февраля 2010

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

27 голосов
/ 04 апреля 2012

В .ч: ​​

typedef enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
} PlayerState;
19 голосов
/ 26 марта 2013

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

typedef NS_ENUM(NSUInteger, PlayerState) {
        PLAYER_OFF,
        PLAYER_PLAYING,
        PLAYER_PAUSED
    };
16 голосов
/ 27 июня 2011

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

В заголовочном файле:

enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
};

typedef NSInteger PlayerState;

См. Руководство по кодированию на http://developer.apple.com/

7 голосов
/ 14 мая 2014

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

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

ч.файл:

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
...