2010-02-06 9 views
169

Deklarowałem wyliczenie w moim pliku implementacyjnym, jak pokazano poniżej, i zadeklarowałem zmienną tego typu w moim interfejsie jako PlayerState thePlayerState; i użyłem zmiennej w moich metodach. Ale dostaję błędy stwierdzające, że są niezgłoszone. W jaki sposób prawidłowo zadeklarować i użyć zmiennej typu PlayerState w moich metodach ?:Jak zdefiniować i użyć ENUM w Objective-C?

w pliku .m

@implementation View1Controller 

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

w pliku .h:

@interface View1Controller : UIViewController { 

    PlayerState thePlayerState; 

w jakiś sposób w .m pliku:

-(void)doSomethin{ 

thePlayerState = PLAYER_OFF; 

} 
+2

Teraz typ enum jest thePlayerState. Co to jest playerStateTypes? –

+3

Aby uzyskać informacje o NS_ENUM i jego najnowszej nowoczesnej składni, zobacz publikację [NS_ENUM i NS_OPTIONS] (http://nshipster.com/ns_enum-ns_options/) autorstwa Mattta Thompsona. –

Odpowiedz

106

Twoje typedef musi być w pliku nagłówka (lub jakiś inny plik, który znajduje się #import ed do twojego nagłówka), ponieważ w przeciwnym razie kompilator nie będzie wiedział, jaki rozmiar utworzyć 01varivar. Poza tym, wygląda mi to dobrze.

+16

+1. Wszystko, co możesz zrobić w C, działa w Objective-C. –

+0

Opcja umieszczenia go w osobnym pliku wydawała się odpowiednia w moim przypadku. Nie wiem, czy to dobre podejście, ale musiałem użyć tego samego wyliczenia w dwóch różnych kontrolerach ViewController (self i jego delegat/źródło danych). Importowanie nagłówka delegata/źródła danych spowodowało błąd i wydaje się zbyt duże dla zwykłej potrzeby. Tak więc utworzyłem nowy plik .h z enum zadeklarowanym i zaimportowanym do obu plików viewControllers.h.Pracował jak urok. –

+6

Powinieneś polecać używanie makra NS_ENUM - ponieważ jest to najlepsza praktyka – khebbie

16

ten sposób firmy Apple robi to dla klas jak NSString:

W pliku nagłówka:

enum { 
    PlayerStateOff, 
    PlayerStatePlaying, 
    PlayerStatePaused 
}; 

typedef NSInteger PlayerState; 

Patrz Wytyczne kodowania w http://developer.apple.com/

+3

To nie pomaga OP. Chociaż technicznie poprawne, nie mówi im, jak utworzyć wielokrotnego użytku enum – RyanR

+21

Łączenie z developer.apple.com nie jest naprawdę pomocne. Czy jest jakieś inne miejsce, które chciałbyś zacytować? – Brett

+0

Skopiuj/wklej dokumentację, która już została podana, link, który jest główną stroną, naprawdę nie pomaga innym osobom ... –

23

W .h:

typedef enum { 
    PlayerStateOff, 
    PlayerStatePlaying, 
    PlayerStatePaused 
} PlayerState; 
+0

Możesz znaleźć odpowiedź na to pytanie w innych pytaniach SO, ale kiedy przeglądałem wyliczenia, to pytanie pojawiło się jako pierwsze, więc dodałem też tutaj odpowiedź . –

191

Firma Apple udostępnia makro pomagające w zapewnieniu lepszej zgodności kodu, w tym Swift. Używanie makra wygląda tak.

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

Documented here

+0

Czy zmienne Obj C mają zmienne składowe podobne do Java? Jeśli tak to jak? – clocksmith

+0

Więc drugie rozwiązanie jest lepsze? –

+3

Drugie rozwiązanie jest lepsze (używając 'NS_ENUM'), ponieważ jest bardziej nowoczesne i jest teraz wymagane w Objective-C, jeśli chcesz, aby twoje wyliczenie było dostępne w kodzie Swift. – smileyborg

19

Z bieżących projektów może chcesz użyć NS_ENUM() lub NS_OPTIONS() makr.

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

Ten miły wpis wyjaśnia, dlaczego: http://nshipster.com/ns_enum-ns_options/ – smileyborg

+2

... a co ważniejsze, musisz zadeklarować wyrażenie przy użyciu 'NS_ENUM' w Objective-C, jeśli chcesz, aby Twoje wyliczenie było dostępne w Swift kod. – smileyborg

5

Polecam używanie NS_OPTIONS lub NS_ENUM. Możesz przeczytać więcej na ten temat tutaj: http://nshipster.com/ns_enum-ns_options/

Oto przykład z mojego własnego kodu za pomocą NS_OPTIONS, mam narzędzie, które ustawia podwarstwy (CALayer) na warstwie UIView, aby utworzyć granicę.

H. Plik:

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 

Plik .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 
Powiązane problemy