Quelle est la différence entre
typedef enum {
...
} Name;
et
enum {
...
};
typedef NSUInteger Name;
? Si la fonctionnalité est la même, quelle est la deuxième forme de bon pour? N'est-il pas inutilement en désordre?
Quelle est la différence entre
typedef enum {
...
} Name;
et
enum {
...
};
typedef NSUInteger Name;
? Si la fonctionnalité est la même, quelle est la deuxième forme de bon pour? N'est-il pas inutilement en désordre?
enum
est aussi vieille que l' C
, donc une partie de l' Objective-C
.
C'est juste explicite du codage int
type. Il est très utile pour le débogage et la plupart des nouvelles compilateurs peuvent faire des optimisations basées sur elle. (Que vous devriez ignorer totalement). Il est le plus utile de rendre votre code plus lisible (pour quelqu'un d'autre, ou pour vous-même après avoir dormi).
typedef enum {
...
} NameType ;
serait suivie par
NameType name;
et c'est typiquement le style préféré de la définition de type,
votre deuxième exemple de ne pas attacher la définition de type pour les valeurs que vous souhaitez spécifier ne doit être d'un type donné.
Notez que cela ne vous empêche pas de l'exécution de
name = 10244; // some non-valid value not listed in the enumeration
mais certains compilateurs peuvent générer un avertissement dans ce cas,
J'ai couru à travers l'utilisation par Apple de la suivante aujourd'hui:
enum {
NSFetchedResultsChangeInsert = 1,
NSFetchedResultsChangeDelete = 2,
NSFetchedResultsChangeMove = 3,
NSFetchedResultsChangeUpdate = 4
};
typedef NSUInteger NSFetchedResultsChangeType;
Ils le font parce qu'ils ont vraiment envie de l' NSFetchedResultsChangeType
pour être de type qu'ils ont défini comme NSUInteger
. Ce peut être un int
, mais il peut aussi être autre chose. Et avec des valeurs de 1, 2, 3, et 4, c'est un peu hors de propos pour nous de quel type est. Mais ils sont de codage à un autre niveau d'abstraction parce qu'ils sont un des outils de fournisseur.
Vous ne devez jamais regarder à Apple pour le style de codage des indices. Si vous voyez quelque chose qui ressemble à du nettoyant/mieux pour le code, il est habituellement. Comme Kevin mentionné, l'API stabilité est d'une importance primordiale pour eux.
Edit (Jan 2013) Si vous avez accès à la WWDC 2012 Session des Vidéos, vous devez surveiller Session 405 - Modern Objective-C
6:00-10:00. Il est question d'une nouvelle syntaxe dans le nouveau compilateur qui permet de dimensionnement explicite d'un type et d'une adhérence des valeurs types. (emprunté à partir de C++ 11)
enum NSFetchedResultsChangeType : NSUInteger {
NSFetchedResultsChangeInsert = 1,
NSFetchedResultsChangeDelete = 2,
NSFetchedResultsChangeMove = 3,
NSFetchedResultsChangeUpdate = 4
};
La première se définit un nom de type à se référer à un enum. C'est la façon dont la plupart des enums sont nommés dans C. ce dernier est un peu différent, et il est répandu dans le Cacao cadres. Il y a deux raisons d'utiliser ce dernier. La première est que si votre enum définit un champ de bits, et que vous voulez ici, parce que quand vous êtes en fournissant une valeur de "Nom", vous serez en fournissant une combinaison des valeurs enum. En d'autres termes, si vous dites quelque chose comme
[self doSomethingWithBitfield:(Enum1 | Enum2)]
vous n'êtes pas le passage d'une valeur de Nom, mais plutôt un entier qui est une combinaison des deux.
Cependant, le Cacao cadres utilisation de cet idiome, même pour les non-champ de bits des valeurs, pour une très bonne raison: API de stabilité. Selon la norme, le sous-jacent de type intégral d'un enum est nécessaire pour être en mesure de contenir toutes les valeurs de l'enum, mais sinon choisie par le compilateur. Cela signifie que l'ajout d'une nouvelle valeur d'énumération pourrait changer le type intégral de l'enum (par exemple en ajoutant -1 pouvez les faire signer, l'ajout de 6 milliards de pouvez en faire un long, etc). C'est une mauvaise chose à partir d'une API point de vue de la stabilité, car le type d'encodage des méthodes qui prennent les valeurs de cette enum pourrait changer de façon inattendue et potentiellement briser le code existant et les binaires. Afin d'éviter cela, le Cacao cadres définissent généralement le type comme étant un NSUInteger (ou NSInteger si ils ont besoin de nombres négatifs), de sorte que l'API et le type des codages de rester stable.
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.