2010-02-06 16 views
169

Ho dichiarato un enum nel mio file di implementazione come mostrato di seguito e ho dichiarato una variabile di quel tipo nella mia interfaccia come PlayerState thePlayerState; e ho usato la variabile nei miei metodi. Ma sto ricevendo errori affermando che non è dichiarato. Come faccio correttamente dichiarare ed utilizzare una variabile di tipo PlayerState nei miei metodi ?:Come definire e utilizzare un ENUM in Objective-C?

Nel file .m

@implementation View1Controller 

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

nel file .h:

@interface View1Controller : UIViewController { 

    PlayerState thePlayerState; 

in qualche modo a di file .m:

-(void)doSomethin{ 

thePlayerState = PLAYER_OFF; 

} 
+2

Ora il tipo di enum è thePlayerState. Che cosa diventano playerStateTypes? –

+3

Per informazioni su NS_ENUM e la sua ultima sintassi moderna, consultare la pubblicazione [NS_ENUM e NS_OPTIONS] (http://nshipster.com/ns_enum-ns_options/) di Mattt Thompson. –

risposta

106

vostre typedef deve essere nel file di intestazione (o qualche altro file che è #import edita nell'intestazione), perché altrimenti il ​​compilatore non saprà quale taglia rendere il ivar PlayerState. Oltre a questo, mi sembra a posto.

+16

+1. Tutto ciò che puoi fare in C funziona in Objective-C. –

+0

L'opzione di metterlo in un file separato sembrava giusto nel mio caso. Non so se questo è un buon approccio, ma avevo bisogno di usare lo stesso enum in due diversi ViewControllers (self ed è delegato/datasource). L'importazione dell'intestazione del delegato/origine dati ha provocato un errore e sembra troppo per un semplice bisogno. Così ho creato un nuovo file .h con l'enum dichiarato e l'ho importato su entrambi i file viewControllers.h.Ha funzionato come un fascino. –

+6

Si consiglia di utilizzare la macro NS_ENUM, poiché questa è la migliore pratica – khebbie

16

Questo è come Apple lo fa per classi come NSString:

Nel file di intestazione:

enum { 
    PlayerStateOff, 
    PlayerStatePlaying, 
    PlayerStatePaused 
}; 

typedef NSInteger PlayerState; 

fare riferimento a linee guida di codifica a http://developer.apple.com/

+3

Questo in realtà non aiuta l'OP. Anche se tecnicamente corretto, non dice loro come creare un enum riutilizzabile – RyanR

+21

Il collegamento a developer.apple.com non è molto utile. C'è un altro posto che vorresti citare, invece? – Brett

+0

Copia/incolla documentazione che ha già dato, il collegamento che è la pagina principale non aiuta davvero altre persone ... –

23

Nella .h:

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

È possibile trovare una risposta come questa in altre domande SO, ma quando ho esaminato le enumerazioni, questa domanda è comparsa per prima, quindi ho aggiunto la risposta anche qui . –

191

Apple fornisce una macro per consentire una migliore compatibilità del codice, incluso Swift. L'uso della macro ha questo aspetto.

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

Documented here

+0

Can Obj C Enum hanno variabili membro come possono in Java? Se é cosi, come? – clocksmith

+0

Quindi la seconda soluzione è migliore? –

+3

La seconda soluzione è migliore (usando 'NS_ENUM'), in quanto è più moderna, ed è ora richiesta in Objective-C se vuoi che il tuo enum sia disponibile nel codice Swift. – smileyborg

19

Con progetti in corso si consiglia di utilizzare i NS_ENUM() o NS_OPTIONS() macro.

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

Questo bel post spiega perché: http://nshipster.com/ns_enum-ns_options/ – smileyborg

+2

... e, cosa più importante ora, devi dichiarare enumerazioni usando "NS_ENUM" in Objective-C se vuoi che il tuo enum sia disponibile in Swift codice. – smileyborg

5

Si consiglia di utilizzare NS_OPTIONS o NS_ENUM. Puoi leggere maggiori informazioni qui: http://nshipster.com/ns_enum-ns_options/

Ecco un esempio del mio codice che utilizza NS_OPTIONS, ho un'utilità che imposta un sottolivello (CALayer) sul livello di un UIView per creare un bordo.

L'h. File:

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 

Il file .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 
Problemi correlati