31 votes

La nouvelle énumération dans Objective-C

Dans les derniers outils, un nouveau type d' enums sont désormais autorisés:

typedef enum CarType : NSUInteger {
  FourDoorCarType,
  TwoDoorCarType
} CarType;

Ma question se trouve dans les parties:

  1. Pourquoi devrais-je l'utiliser à la place de l'ancienne?

  2. Pourquoi est - CarType apparaissent deux fois? J'ai essayé de sauter la première CarType , en laissant la première ligne comme "typedef enum : NSUInteger {", et il semble bien fonctionner. Quels sont les inconvénients, le cas échéant?

  3. Certains types autres que l' NSUInteger - ils être utilisés?

37voto

Robert Vojta Points 4346

Parce que cette nouvelle façon vous aide avec la saisie semi-automatique, l'instruction switch, de meilleurs avertissements respectivement plus précis, ...

Stick avec macro ...

 typedef NS_ENUM( NSUInteger, CarType ) {
  FourDoorCarType,
  TwoDoorCarType
};
 

... lisez ceci par exemple http://stackoverflow.com/a/3190470/581190

NSInteger, ... quels types voulez-vous?

19voto

Kevin Ballard Points 88866
  1. Cela définit explicitement le type numérique que l'enum utilise. Cette aide à la portabilité des préoccupations. Il aide également si vous avez besoin de contrôler signé vs non signé

  2. Deux types sont en fait définis ici. La première est enum CarType , et le second est CarType, ce qui est un alias de enum CarType. Vous pouvez omettre le premier CarType si vous le souhaitez. Cela empêche enum CarType d'un type défini, mais CarType est toujours valide. Une autre chose que les gens font c'est quelque chose comme

    typedef enum _EnumName {
        values
    } EnumName;
    

    Ce que vous décidez à faire, voici quelque chose d'une question de préférence personnelle.

  3. Oui. Vous pouvez utiliser n'importe quel type numérique, bien que les valeurs enum doit être capable de s'adapter dans le type choisi.

4voto

Jorge Vasquez Points 118

Un gros avantage est que vous pouvez transmettre des énumérations avec cette syntaxe:

 enum CarType : NSUInteger;
 

Cela permet d'éviter d'inclure des en-têtes volumineux dans d'autres en-têtes simplement en raison des définitions d'énumération.

3voto

Cyrille Points 11109

Pour le point 2: c'est la "même ancienne syntaxe" de C: typedef <something> <alias> . Ici, something est enum <enumIdent> { <a, b, c, d, ...> } .

Vous êtes autorisé à utiliser le même nom pour enumIdent et alias , simplement.

1voto

holex Points 7714

les réponses seront là pour vous.

typedef enum MYCARTYPE { // you could drop the ": NSInteger" part to you could drop the the MYCARTYPE name as well, if you like.
  FourDoorCarType,
  TwoDoorCarType
} CarType;

Pourquoi devrais-je l'utiliser à la place de l'ancienne?

vous pouvez utiliser l'ancienne méthode, à l'étape actuelle.

Pourquoi est - CarType apparaissent deux fois? J'ai essayé de sauter la première CarType , en laissant la première ligne comme typedef enum : NSUInteger {, et il semble bien fonctionner. Quels sont les inconvénients, le cas échéant?

parce que vous avez nommé l' enum comme CarType , puis vous avez nommé le nouveau type, en typedef définition CarType ainsi. vous n'avez pas besoin de nom de l' enum parce que vous ne pouvez pas utiliser son nom n'importe où. le nom du nouveau type devrait être suffisant.

Certains types autres que l' NSUInteger - ils être utilisés?

oui, vous le pouvez, les types sont toujours NSInteger, vous n'avez pas besoin de limiter unsigned integer.

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