1102 votes

Qu'est ce qu'un typedef enum en Objective-C?

Je ne pense pas fondamentalement comprendre ce qu'est un enum , et à quel moment l'utiliser.

Par exemple:

typedef enum {
    kCircle,
    kRectangle,
    kOblateSpheroid
} ShapeType;

Ce qui est vraiment d'être déclaré ici?

1575voto

Adam Rosenfield Points 176408

Trois choses sont déclarés ici: un anonyme, un type énuméré est déclaré, ShapeType est déclaré un typedef pour que l'énumération anonyme, et les trois noms kCircle, kRectangle, et kOblateSpheroid sont déclarées comme faisant partie intégrante des constantes.

Nous allons casser vers le bas. Dans le cas le plus simple, une énumération peut être déclarée

enum tagname { ... };

Il déclare une énumération avec le tag tagname. En C et Objective-C (mais pas en C++), toutes les références à cette doit être précédée de l' enum mot-clé. Par exemple:

enum tagname x;  // declare x of type 'enum tagname'
tagname x;  // ERROR in C/Objective-C, OK in C++

Afin d'éviter d'avoir à utiliser l' enum mot-clé partout, une définition de type peuvent être créés:

enum tagname { ... };
typedef enum tagname tagname;  // declare 'tagname' as a typedef for 'enum tagname'

Cela peut être simplifiée en une seule ligne:

typedef enum tagname { ... } tagname;  // declare both 'enum tagname' and 'tagname'

Et enfin, si nous n'avons pas besoin d'être en mesure d'utiliser enum tagname avec l' enum mot-clé, nous pouvons faire l' enum anonyme et uniquement le déclarer à la définition de type nom:

typedef enum { ... } tagname;

Maintenant, dans ce cas, nous allons déclarer ShapeType être un typedef ed nom d'une énumération anonyme. ShapeType est vraiment juste un type intégral, et ne doit être utilisé pour déclarer des variables qui détiennent l'une des valeurs inscrites dans la déclaration (c'est l'une des kCircle, kRectangle, et kOblateSpheroid). Vous pouvez attribuer un ShapeType variable à une autre valeur par coulée, cependant, de sorte que vous devez être prudent lors de la lecture des valeurs enum.

Enfin, kCircle, kRectangle, et kOblateSpheroid sont déclarées comme faisant partie intégrante des constantes dans l'espace de noms global. Depuis pas de valeurs spécifiques ont été spécifiées, elles sont attribuées aux nombres entiers consécutifs à partir de 0, alors kCircle 0, kRectangle est de 1, et kOblateSpheroid 2.

262voto

Vladimir Grigorov Points 3306

Apple recommande de définir les énumérations comme ça depuis Xcode 4.4:

typedef enum ShapeType : NSUInteger {
    kCircle,
    kRectangle,
    kOblateSpheroid
} ShapeType;

Ils fournissent aussi une pratique de la macro NS_ENUM:

typedef NS_ENUM(NSUInteger, ShapeType) {
    kCircle,
    kRectangle,
    kOblateSpheroid
};

Ces définitions de donner plus de la vérification du type et de mieux la complétion de code. Je ne pouvais pas trouver une documentation officielle de NS_ENUM, mais vous pouvez regarder "Moderne Objective-C" de la vidéo à partir de la WWDC 2012 session ici.

50voto

hburde Points 1008

Un enum déclare un ensemble de valeurs ordonnées - le typedef ajoute simplement une pratique de nom à ce. Le 1er élément est 0 etc.

typedef enum {
Monday=1,
...
} WORKDAYS;

WORKDAYS today = Monday;

Ce qui précède est juste une énumération de shapeType balises.

34voto

Brian Mitchell Points 1881

Un type défini par l'utilisateur qui a les valeurs possibles de l' kCircle, kRectangleou kOblateSpheroid. Les valeurs de l'enum (kCircle, etc) sont visibles de l'extérieur de l'enum. Il est important de garder cela à l'esprit (int i = kCircle; est valable, par exemple).

25voto

annu Points 191

Enum est défini par l'utilisateur type de données. TYPES DE DONNÉES ÉNUMÉRÉ Énumérés variables de type de données ne peut que supposer les valeurs qui ont été précédemment déclarée.

enum month { jan = 1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec };
enum month this_month;

this_month = feb;

Dans la déclaration ci-dessus, mois est déclaré comme un énumérés type de données. Il se compose d'un ensemble de valeurs, de jan à déc. Numériquement, jan est donné la valeur 1, février la valeur 2, et ainsi de suite.

La variable this_month est déclaré du même type que mois, puis est affecté à la valeur associée à févr. This_month ne peut pas être affecté toutes les valeurs en dehors de ceux spécifiés dans la liste d'initialisation pour la déclaration de mois.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X