Objective-C에서 ENUM을 어떻게 정의하고 사용합니까?


180

아래에 표시된 것처럼 구현 파일에 열거 형을 선언하고 내 인터페이스에서 해당 유형의 변수를 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;

}

2
이제 열거 형의 유형은 PlayerState입니다. playerStateTypes는 어떻게됩니까?
user4951

3
NS_ENUM 및 최신 최신 구문에 대한 정보는 Mattt Thompson의 NS_ENUM & NS_OPTIONS 게시를 참조하십시오 .
Basil Bourque

답변:


109

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


별도의 파일에 넣는 옵션이 제 경우에는 적절 해 보였습니다. 이것이 좋은 접근 방법인지는 모르겠지만 두 개의 다른 ViewController (자체 및 대리자 / 데이터 소스)에서 동일한 열거 형을 사용해야했습니다. 델리게이트 / 데이터 소스의 헤더를 가져 오면 오류가 발생하여 간단한 요구에 비해 너무 많은 것 같습니다. 그래서 열거 형을 선언하여 새 .h 파일을 만들고 두 viewControllers.h 파일로 가져 왔습니다. 매력처럼 일했다.
Leandro Alves

7
NS_ENUM 매크로를 사용하는 것이 좋습니다 – 이것이 최선의 방법
이므로

1
NS_ENUM열거 형을 Swift 코드에서 사용할 수있게하려면 Objective-C에서 사용하여 열거 형을 선언해야합니다 .
smileyborg

@DaveDeLong, 2015 년에도 유효합니까? 나는 한 typedef에서 선언 된 .m파일은 컴파일 잘 실행됩니다.
Iulian Onofrei

@IulianOnofrei 다른 파일에서 열거 형을 사용해야하는 경우 .h 파일로 이동합니다. 하나의 파일에만 필요하면 .m 파일에 넣으면 항상 완벽합니다.
Dave DeLong

206

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

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

여기에 문서화


Obj C Enum은 Java에서와 같이 멤버 변수를 가질 수 있습니까? 그렇다면 어떻게?
clocksmith

두 번째 해결책이 더 낫습니까?
Iulian Onofrei

3
두 번째 솔루션은 더 NS_ENUM현대적이므로을 사용하는 것이 더 좋으며 ( Swift 코드에서 열거 형을 사용하려면 Objective-C에 필요합니다.
smileyborg

두 번째 솔루션이 실제로 더 나은 것으로 표시되도록 업데이트되었습니다.
rebelzach

Apple 표준 형식에서 각 열거 형 값에 대해 유형 이름이 반복됩니다.
ThomasW

29

.h에서 :

typedef enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
} PlayerState;

1
다른 SO 질문에서 이와 같은 대답을 찾을 수 있지만 열거 형을 검토 할 때이 질문이 먼저 나타 났으므로 여기에도 대답을 추가했습니다.
벤 플린

19

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

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

2
... 그리고 더 중요한 것은 NS_ENUM열거 형을 Swift 코드에서 사용하려면 Objective-C에서 사용하여 열거 형을 선언해야합니다 .
smileyborg

16

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

헤더 파일에서 :

enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
};

typedef NSInteger PlayerState;

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


3
실제로 OP에는 도움이되지 않습니다. 기술적으로는 정확하지만 재사용 가능한 열거 형을 만드는 방법을 알려주지는 않습니다.
RyanR

24
developer.apple.com에 연결하는 것은 실제로 도움이되지 않습니다. 대신 인용하고 싶은 다른 곳이 있습니까?
Brett

이미 제공 한 문서 복사 / 붙여 넣기, 기본 페이지 인 링크는 실제로 다른 사람들에게 도움이되지 않습니다 ...
Onder OZCAN

3
이제 구식입니다.이 페이지를 참조하십시오 developer.apple.com/library/ios/releasenotes/ObjectiveC/…
Alex Chesters

8

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.