如何在Objective-C中定义和使用ENUM?

时间:2010-02-06 04:37:31

标签: iphone objective-c c

我在我的实现文件中声明了一个枚举,如下所示,并在我的接口中将该类型的变量声明为PlayerState thePlayerState;并在我的方法中使用了变量。但是我收到错误声明它是未声明的。如何在我的方法中正确声明和使用PlayerState类型的变量?:

在.m文件中

@implementation View1Controller

    typedef enum playerStateTypes
        {
            PLAYER_OFF,
            PLAYER_PLAYING,
            PLAYER_PAUSED
        } PlayerState;
<。>文件中的

@interface View1Controller : UIViewController {

    PlayerState thePlayerState;
<。>在.m文件中的某些方法:

-(void)doSomethin{

thePlayerState = PLAYER_OFF;

}

6 个答案:

答案 0 :(得分:204)

Apple提供了一个宏来帮助提供更好的代码兼容性,包括Swift。使用宏看起来像这样。

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

Documented here

答案 1 :(得分:108)

您的typedef需要位于头文件中(或者#import添加到您的标头中的其他文件),否则编译器将无法知道{{1}的大小伊娃。除此之外,它看起来还不错。

答案 2 :(得分:27)

在.h:

typedef enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
} PlayerState;

答案 3 :(得分:19)

使用当前项目,您可能需要使用NS_ENUM()NS_OPTIONS()宏。

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

答案 4 :(得分:16)

这就是Apple为NSString这样的课程所做的事情:

在头文件中:

enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
};

typedef NSInteger PlayerState;

请参阅http://developer.apple.com/

上的编码指南

答案 5 :(得分:6)

我建议使用NS_OPTIONS或NS_ENUM。您可以在此处详细了解:http://nshipster.com/ns_enum-ns_options/

以下是我自己的代码中使用NS_OPTIONS的示例,我有一个实用程序,可以在UIView的图层上设置子图层(CALayer)来创建边框。

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