79 votes

L'avant-déclarer enum en Objective-C

J'ai de la difficulté avec le protocole enum visibilité Objective-C programme. J'ai deux fichiers d'en-tête, et on définit un typedef enum. Un autre fichier doit utiliser l' typedef'd type.

En ligne droite C, je voudrais simplement #include autre fichier d'en-tête, mais en Objective-C, il est recommandé de ne pas utiliser #import entre les fichiers d'en-tête, au lieu d'utiliser de l'avant @class des déclarations en tant que de besoin. Cependant, je ne peux pas comprendre comment l'avant-déclarer un type d'énumération.

Je n'ai pas besoin réelles valeurs énumérées, à l'exception de la correspondante .m de la mise en œuvre de fichier, où je peux en toute sécurité #import loin. Alors, comment puis-je obtenir de l' typedef enum à être reconnu dans l'en-tête?

16voto

Peter N Lewis Points 12025

La réponse à votre question est d'aller de l'avant et de l'importation de la définition de type fichier d'en-tête ou l'utilisation d'un type générique comme NSInteger plutôt du type enum.

Cependant, il n'y a plus de raison de ne pas l'importation d'un fichier d'en-tête que de simplement compiler vitesse.

Pas de l'importation d'un fichier d'en-tête permet également de réduire votre involontaire d'accès à des classes.

Par exemple, disons que vous avez un TrackFileChanges classe qui suit le système de fichiers pour les modifications apportées à un fichier spécifique, et vous avez un CachedFile classe qui stocke les données mises en cache à partir d'un fichier. Ce dernier peut utiliser un privé ivar de type TrackFileChanges*, mais pour des utilisations de CachedFile, ce n'est qu'un détail d'implémentation (dans l'idéal, le ivar serait auto-généré avec une propriété privée, à l'aide de la nouvelle de l'exécution, mais ce n'est pas possible si vous utilisez l'ancien temps d'exécution).

Afin que les clients qui #import "CachedFile.h" n'ont probablement pas besoin ou que vous voulez accéder à TrackFileChanges.h. Et s'ils le font, ils doivent indiquer clairement par #l'importation d'eux-mêmes. En utilisant @classe TrackFileChanges instea de #import "TrackFileChanges.h" dans CachedFile.h-vous améliorer l'encapsulation.

Mais tout cela étant dit, il n'y a rien dans al'erreur à l'importation d'un fichier d'en-tête à partir d'un deuxième fichier d'en-tête si le second en-tête veut exposer le premier de tous les clients. Par exemple, les fichiers d'en-tête déclarant des classes doivent être importés directement dans le sous-classement fichiers d'en-tête et les fichiers d'en-tête déclarant les protocoles pourraient bien être importés directement (bien que youy pouvez utiliser @protocole ABC; pour éviter cela).

9voto

Sebastian Celis Points 7284

Aller de l'avant et utiliser #import. La seule raison pour laquelle les gens vous recommandons d'utiliser @class lorsque cela est possible est parce que cela rend votre code légèrement plus rapide à compiler. Cependant, il n'y a pas de problème avec l' #importing un .h fichier à partir d'un autre. En fait, vous avez besoin pour ce faire lors de l'extension d'une autre classe.

4voto

justin Points 72871

Si vous êtes ok à l'aide du compilateur extensions, vous pouvez utiliser cette commande dans Clang:

enum Enum;
typedef enum Enum Enum2;

void f(Enum2); // ok. it sees this type's true name.

enum Enum {
    E_1
};

// ok. now its declaration is visible and we can use it.

void f(Enum2 e) {

}

Remarque: Il sera le déclencheur d'un -Wpedantic d'avertissement.


Si vous êtes à l'aide de C++11, vous devez utiliser leurs énumérations, qui sont sûrs à déclarer avant -- par exemple, enum class Enum:uint8_t; (pas un compilateur, par extension).

-1voto

Georg Schölly Points 63123

Vous devez soit #import de toute façon ou de la création d'un fichier d'en-tête contenant uniquement de l' typedef. Pas de l'importation de fichiers d'en-tête dans un en-tête qui rend la compilation plus rapide, mais ne pas changer quoi que ce soit d'autre.

Pourquoi ne pas le support du C++ avant la déclaration d'énumérations?

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