Come definire e utilizzare un ENUM in Objective-C?


180

Ho dichiarato un enum nel mio file di implementazione come mostrato di seguito e 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 posso dichiarare e utilizzare correttamente una variabile di tipo PlayerState nei miei metodi ?:

Nel file .m

@implementation View1Controller

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

nel file .h:

@interface View1Controller : UIViewController {

    PlayerState thePlayerState;

in alcuni metodi nel file .m:

-(void)doSomethin{

thePlayerState = PLAYER_OFF;

}

2
Ora il tipo di enum è thePlayerState. Cosa diventa playerStateTypes?
user4951

3
Per informazioni su NS_ENUM e la sua sintassi moderna più recente, vedere la pubblicazione NS_ENUM e NS_OPTIONS di Mattt Thompson.
Basil Bourque,

Risposte:


109

Il tuo typedefbisogno di essere nel file di intestazione (o qualche altro file che è #importEd nella vostra intestazione), perché altrimenti il compilatore non scegliere le dimensioni per rendere PlayerStatel'ivar. A parte questo, mi sembra ok.


L'opzione di metterlo in un file separato sembrava giusto nel mio caso. Non so se questo è un buon approccio, ma dovevo usare lo stesso enum in due ViewController diversi (self e il suo delegate / datasource). L'importazione dell'intestazione del delegato / origine dati ha provocato un errore e sembra troppo per una semplice necessità. Quindi ho creato un nuovo file .h con l'enum dichiarato e importato su entrambi i file viewControllers.h. Ha funzionato come un fascino.
Leandro Alves,

7
Dovrei raccomandare di usare la macro NS_ENUM - poiché questa è la migliore pratica
khebbie il

1
Devi dichiarare enum usando NS_ENUMin Objective-C se vuoi che il tuo enum sia disponibile nel codice Swift.
smileyborg,

@DaveDeLong, è ancora valido nel 2015? Ho il typedefdichiarato nel .mfile e si compila e funziona bene.
Iulian Onofrei,

@IulianOnofrei andrebbe nel file .h se hai bisogno di usare l'enum in altri file. Se ne hai bisogno in un solo file, metterlo nel file .m è sempre stato perfettamente perfetto.
Dave DeLong,

206

Apple fornisce una macro per aiutare a fornire una migliore compatibilità del codice, incluso Swift. L'utilizzo della macro è simile al seguente.

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

Documentato qui


Obj C Enums può avere variabili membro come in Java? Se é cosi, come?
fabbro

Quindi la seconda soluzione è migliore?
Iulian Onofrei

3
La seconda soluzione è migliore (usando NS_ENUM), poiché è più moderna, ed è ora richiesta in Objective-C se vuoi che la tua enum sia disponibile nel codice Swift.
smileyborg,

Aggiornato per mostrare che la seconda soluzione è in effetti migliore.
rebelzach,

Nel modulo standard di Apple, il nome del tipo viene ripetuto per ciascun valore enum.
ThomasW,

29

Nel .h:

typedef enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
} PlayerState;

1
Puoi trovare una risposta come questa in altre domande SO, ma quando stavo rivedendo le enumerazioni, questa domanda è spuntata per prima, quindi ho aggiunto anche la risposta qui.
Ben Flynn,

19

Con i progetti attuali potresti voler usare le macro NS_ENUM()o NS_OPTIONS().

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

2
... e ancora più importante ora, devi dichiarare enum usando NS_ENUMin Objective-C se vuoi che il tuo enum sia disponibile nel codice Swift.
smileyborg,

16

Ecco come lo fa Apple per classi come NSString:

Nel file di intestazione:

enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
};

typedef NSInteger PlayerState;

Fare riferimento alle Linee guida per la codifica su http://developer.apple.com/


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

24
Il collegamento a developer.apple.com non è davvero utile. C'è qualche altro posto che vorresti citare invece?
Brett,

Copia / incolla la documentazione che ha già fornito, il link che è la pagina principale non aiuta davvero altre persone ...
Onder OZCAN,

3
Questo non è più aggiornato, consultare questa pagina developer.apple.com/library/ios/releasenotes/ObjectiveC/…
Alex Chesters,

8

Consiglio di usare NS_OPTIONS o NS_ENUM. Puoi leggere di più qui: http://nshipster.com/ns_enum-ns_options/

Ecco un esempio del mio codice usando NS_OPTIONS, ho un'utilità che imposta un sublayer (CALayer) sul livello di una 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.