La première question est de savoir quelle portée vous voulez que vos constantes aient, qui sont en réalité deux questions:
- Ces constantes sont-elles spécifiques à une seule classe ou est-il judicieux de les avoir partout dans l'application?
- S'ils sont spécifiques à la classe, sont-ils destinés à être utilisés par les clients de la classe, ou uniquement au sein de la classe?
S'ils sont spécifiques et internes à une seule classe, déclarez-les en static const
haut du fichier .m, comme ceci:
static NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
S'ils appartiennent à une seule classe mais devraient être publics / utilisés par d'autres classes, déclarez-les comme extern
dans l'en-tête et définissez-les dans le .m:
//.h
extern NSString *const MyThingNotificationKey;
//.m
NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
Si elles doivent être globales, déclarez-les dans un en-tête et définissez-les dans un module correspondant, spécifiquement pour ces constantes.
Vous pouvez les mélanger et les assortir pour différentes constantes avec différents niveaux de globalité que vous voulez qu'elles soient, et pour différentes constantes globales qui ne vont tout simplement pas ensemble - vous pouvez les mettre dans des modules séparés, chacun avec son propre en-tête, si vous vouloir.
Pourquoi pas #define
?
La vieille réponse est «les macros n'ont pas d'informations de type», mais les compilateurs d'aujourd'hui sont assez intelligents pour faire tout le contrôle de type pour les littéraux (vers lesquels les macros s'étendent) ainsi que pour les variables.
La réponse moderne est que le débogueur ne connaîtra pas vos macros. Vous ne pouvez pas dire [myThing addObserver:self forKey:MyThingNotificationKey]
dans une commande de débogage si MyThingNotificationKey
est une macro; le débogueur ne peut le savoir que s'il s'agit d'une variable.
Pourquoi pas enum
?
Eh bien, rmaddy m'a battu dans les commentaires: enum
ne peut définir que des constantes entières. Des choses comme les numéros d'identification de série, les masques binaires, les codes à quatre octets, etc.
À ces fins, enum
c'est génial et vous devez absolument l'utiliser. (Encore mieux, utilisez les macros NS_ENUM
etNS_OPTIONS
.) Pour d'autres choses, vous devez utiliser autre chose; enum
ne fait rien d'autre que des entiers.
Et d'autres questions
Je pensais importer le fichier dans le fichier Reddit-Prefix.pch pour rendre les constantes disponibles pour tous les fichiers. Est-ce une bonne façon de faire les choses?
Probablement inoffensif, mais probablement excessif. Importez vos en-têtes de constantes là où vous en avez besoin.
Quels sont les cas d'utilisation de chacune de ces solutions?
#define
: Assez limité. Honnêtement, je ne suis pas sûr qu'il y ait une bonne raison d'utiliser cela pour les constantes.
const
: Idéal pour les constantes locales. De plus, vous devez l'utiliser pour celui que vous avez déclaré dans un en-tête et que vous définissez maintenant.
static const
: Idéal pour les constantes spécifiques au fichier (ou à la classe).
extern const
: Vous devez l'utiliser lors de l'exportation d'une constante dans un en-tête.
De plus, si vous utilisez extern const
, dois-je importer le fichier, ou les constantes seront-elles disponibles globalement sans importer le fichier?
Vous devez importer le fichier, soit dans chaque fichier où vous l'utilisez, soit dans l'en-tête du préfixe.