12
votes

Pourquoi Cocoa n'utilise-t-il pas le même style de déclaration d'enum partout?

Je me demandais quelle est la justification de différents styles de déclaration d'énumération sur le cacao?

comme ceci: p>

enum { constants.. }; typedef NSUInteger sometype;


1 commentaires

TapeDef et Enum sont très différents ... Je ne comprends pas vraiment votre question? Les énumjets sont utilisés pour configurer des collections de constantes integer nommées. TLECDEF est utilisé pour donner un nouveau nom de type de données, souvent pour supporter différentes architectures ...


3 Réponses :


1
votes

tandis que vous pouvez utiliser quelque chose comme

  typedef enum { constants... } sometype;


0 commentaires

2
votes

est la raison d'utiliser TEPDEF pour obtenir Attention à Nsuinteger pour travailler sans casting?

Le typeDEF est utilisé pour spécifier le type de base pour les valeurs de dénombrement. Vous pouvez toujours lancer une valeur d'énumération à un autre type tant que vous tronquez la valeur, en casting à un type plus petit ( nsuinteger à non signé court ).

NSInteger et Nsuinteger a été introduit pour faciliter la migration des 64 bits d'applications, en fournissant un type d'architecture / plate-forme indépendante pour les entiers signés et non signés. De cette façon, peu importe le nombre de bits de la CPU, les applications n'ont pas besoin d'être réécrites.

Parfois, le typlef est l'un des Nsinteger / Nsuinteger, pourquoi ne pas utiliser Nsinteger toujours? Y a-t-il réel Bénéfice en utilisant nsuinteger?

Le choix dépend des valeurs de l'énumération. Certaines énumérations ont beaucoup de valeurs, elles ont donc besoin de tous les bits disponibles:

  • Nsinteger propose 2 ^ 31 valeurs positives et négatives (sur l'architecture de 32 bits).
  • Nsuinteger propose 2 ^ 32 valeurs positives (sur l'architecture de 32 bits).
  • Si votre énumération est censée uniquement contenir des valeurs positives, utilisez Nsuinteger.
  • Si votre énumération est censée contenir des valeurs positives et négatives, utilisez Nsinteger.
  • Nsuinteger est généralement utilisé pour l'énumération des drapeaux, car il fournit 32 valeurs distinctes (sur l'architecture de 32 bits) à combiner à volonté.

    Je ne sais pas s'il y a une règle de choix dans l'équipe du développement Apple pour cela. J'espère que ...


2 commentaires

Vous voulez dire 2 à la puissance de 31 et 32, non? En outre, les deux types offrent 2 32 valeurs distinctes; La différence est qu'avec un type signé (tel que nsinteger ), la moitié d'entre eux (2 31) sont négatifs et environ la moitié (2 31 - 1) sont positifs. Avec un type non signé, tous les 2 32 sont non négatifs. Et c'est la vraie différence: si toutes vos valeurs de dénombrement seront toujours positives, vous pouvez déclarer le type comme Nsuinteger . Inversement, si vous allez avoir des valeurs négatives, vous devez utiliser nsinteger .


Tu as raison. J'étais signification des valeurs du drapeau. J'ai mis à jour ma réponse en conséquence.



12
votes

Plusieurs raisons:

Raison 1: Flexibilité: xxx

déclare une énumération. Vous pouvez utiliser les valeurs oui , n ° et peut-être n'importe où et attribuez-les à n'importe quel type intégré. Vous pouvez également utiliser ceci comme type, en écrivant xxx

ceci le rend agréable car si une fonction prend un paramètre avec le type Enum Lickahoctor, vous saurez que vous pouvez attribuer oui , n ° ou peut-être à celui-ci. En outre, le débogueur saura, donc cela affichera le nom symbolique au lieu de la valeur numérique. Le problème est que le compilateur ne vous permettra que d'attribuer des valeurs que vous avez définies dans Enum Lickahoctor à myvar . Si vous voulez par exemple définir quelques drapeaux dans la classe de base, ajoutez quelques drapeaux supplémentaires dans la sous-classe, vous ne pouvez pas le faire de cette façon.

Si vous utilisez un int à la place, vous ne pouvez pas 't avoir ce problème. Donc, vous voulez utiliser une sorte d'int, vous pouvez donc affecter des constantes arbitraires.

Raison 2: Compatibilité binaire:

Le compilateur choisit une belle taille Cela correspond à toutes les constantes que vous avez définies dans un énumé. Il n'y a aucune garantie ce que vous obtiendrez. Donc, si vous écrivez une structure contenant une telle variable directement à un fichier, rien ne garantit qu'il sera toujours de la même taille lorsque vous le lisez avec la prochaine version de votre application (selon la norme C, au moins - - Ce n'est pas tout à fait si sombre dans la pratique).

Si vous utilisez plutôt une sorte de int, la plate-forme garantit généralement une taille particulière pour ce nombre. Surtout si vous utilisez l'un des types garantis pour être une taille particulière, comme int32_t / uint32_t .

Raison 3: lisibilité et auto -documentation

Lorsque vous déclarez myvar ci-dessus, il est immédiatement évident quelles valeurs vous pouvez y mettre. Si vous utilisez simplement un int, ou un uint32_t , ce n'est pas le cas. Donc, ce que vous faites est que vous utilisez xxx

pour définir un nom agréable pour l'entier quelque part près des constantes qui rappelleront aux gens qu'une variable de ce type peut contenir cette valeur. Mais vous bénéficiez toujours d'une taille prévisible, d'une taille fixe et de la capacité de définir des valeurs supplémentaires dans des sous-classes, si nécessaire.

Raison 4: Soutien aux bitfields < P> Variables Tapées Enum uniquement Prise en charge d'attribuer exactement une valeur de leurs options. Donc, si vous essayez de mettre en œuvre un champ de bit, vous ne pouvez pas le taper comme un bitfield. De plus, vous devez utiliser des variables non signées pour éviter une extension de signe de vous vêtir.


3 commentaires

Nsinteger n'est pas garantie d'être une taille particulière, il est garanti d'être différent sur i386 et x86_64 . Si vous avez écrit un fichier binaire avec un Lickahoctor sur un duo Core, a mis à niveau votre Mac et lisez-le, hilarité s'ensuivrait.


Bien sûr, Graham. Brainfart là-bas. Merci de corriger cela.


Dans l'intérêt des gens googling cet article, j'ai changé de mention de Nsinteger à uint32_t ci-dessus. Néanmoins, Apple utilise souvent Nsinteger, ce qui signifie que vous obtenez un int32_t sur 32 bits, mais un INT64_T sur 64 bits. Cela signifie que le code compilé pour 32 et 64 bits est binaire incompatible entre eux (ne peut pas écrire cela sur le disque), mais au moins il est fiable, peu importe combien d'autres constantes que vous ajoutez plus tard à l'énum.