Possible d’append un autre élément à un type d’énumération existant?

Je me demande s’il est possible d’append / append un autre élément à un type d’énum existant (partie d’un framework)?

Quelque chose comme ça: nous avons le type enum

  typedef enum { UIModalTransitionStyleCoverVertical = 0, UIModalTransitionStyleFlipHorizontal, UIModalTransitionStyleCrossDissolve, UIModalTransitionStylePartialCurl, } UIModalTransitionStyle; 

Maintenant, je veux append ou append à cet ensemble un élément tel que UIModalTransitionStyleCoverVerticalFlipped . Quelque chose comme ça peut-il être accompli?

Vous pouvez forcer un nouvel élément à avoir le même type que l’énumération, mais vous ne pouvez pas l’étendre dans une sous-classe. header de fichier:

 extern const UIModalTransitionStyle UIModalTransitionStyleCoverVerticalFlipped; 

fichier d’implémentation:

 const UIModalTransitionStyle UIModalTransitionStyleCoverVerticalFlipped = 10; 

Assurez-vous de laisser un peu d’espace au cas où le cadre serait étendu, afin d’éviter les conflits. C’est un peu un bidouillage, mais il va se débarrasser des erreurs et des avertissements du compilateur.

Pour ce faire, vous devez modifier la définition de type d’origine afin d’inclure la nouvelle valeur:

 typedef enum { UIModalTransitionStyleCoverVertical = 0, UIModalTransitionStyleFlipHorizontal, UIModalTransitionStyleCrossDissolve, UIModalTransitionStylePartialCurl, UIModalTransitionStyleCoverVerticalFlipped } UIModalTransitionStyle; 

Sinon, vous pouvez tenter votre chance et le définir séparément:

 typedef enum { UIModalTransitionStyleCoverVertical = 0, UIModalTransitionStyleFlipHorizontal, UIModalTransitionStyleCrossDissolve, UIModalTransitionStylePartialCurl, } UIModalTransitionStyle; typedef enum { UIModalTransitionStyleCoverVerticalFlipped = UIModalTransitionStylePartialCurl + 1 } ExtendedUIModalTransitionStyle; 

Une variable pouvant contenir l’énumération d’origine fonctionnera également parfaitement si / si vous affectez également la nouvelle valeur (dans un cas typique, il s’agira simplement d’un int ), mais ce n’est pas garanti. Au moins en théorie, l’implémentation peut / peut affecter un nombre de bits suffisant pour contenir cette énumération, de sorte qu’append plus de valeurs de cette manière ne fonctionnerait pas. Il peut également effectuer une vérification de plage pour ne pas autoriser l’atsortingbution d’ une valeur hors plage. Aucune de ces méthodes n’est commune, donc d’un sharepoint vue pratique ce n’est probablement pas un problème – mais d’un sharepoint vue théorique, rien ne garantit réellement que du code comme celui-ci fonctionnera.

Peut-être que cela peut vous aider:

 typedef NS_ENUM(NSInteger, BaseType) { BaseTypeCase1, BaseTypeCase2, BaseTypeSize }; typedef NS_ENUM(NSInteger, SubType) { SubTypeCase1 = BaseTypeSize, SubTypeCase2 }; 

Vous pouvez maintenant activer le sous-type en sachant que les valeurs sont uniques.

Si vous n’avez pas access à BaseType, vous pouvez définir SubTypeCase1 sur le dernier élément de BaseType + 1.

Inconvénient, vous ne pouvez pas déclarer une méthode qui prend un sous-type et lui passer un BaseType sans obtenir un avertissement du compilateur. Vous devez donc déclarer vos méthodes pour prendre NSIntegers afin de faire taire cet avertissement. En outre, il est étrange de devoir déclarer un paramètre de sous-type et de pouvoir passer dans un type de base.

Pour ce faire, vous devez mettre à jour la déclaration Enum afin d’inclure UIModalTransitionStyleCoverVerticalFlipped ainsi que ces valeurs.

 typedef enum { UIModalTransitionStyleCoverVertical = 0, UIModalTransitionStyleFlipHorizontal, UIModalTransitionStyleCrossDissolve, UIModalTransitionStylePartialCurl, UIModalTransitionStyleCoverVerticalFlipped } UIModalTransitionStyle; 

donc UIModalTransitionStyleCoverVerticalFlipped sera équivalent à la constante entière 4

où que vous utilisiez une constante de chaîne de Enum dec. la valeur constante correspondante est remplacée, elle est donc utilisée pour contraindre la variable à ne conserver que l’ensemble spécifié de valeurs (c’est-à-dire 0 à 4) dans le cas mentionné ci-dessus