[iphone] Objective-C에서 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;

}



답변

귀하의 typedef요구 헤더 파일 (또는있어 다른 파일에 있어야합니다 #import, 그렇지 않으면 컴파일러가 만드는 어떤 크기를 알 수 없기 때문에, 헤더에 에드) PlayerState바르 있습니다. 그 외에는 괜찮아 보입니다.


답변

Apple은 Swift를 포함하여 더 나은 코드 호환성을 제공하는 데 도움이되는 매크로를 제공합니다. 매크로를 사용하면 다음과 같습니다.

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

여기에 문서화


답변

.h에서 :

typedef enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
} PlayerState;


답변

현재 프로젝트에서는 NS_ENUM()또는 NS_OPTIONS()매크로 를 사용할 수 있습니다 .

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


답변

다음은 NSString과 같은 클래스에서 Apple이 수행하는 방식입니다.

헤더 파일에서 :

enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
};

typedef NSInteger PlayerState;

http://developer.apple.com/의 코딩 지침을 참조하십시오.


답변

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


답변