La première question est de savoir quelle étendue vous voulez que votre constantes d'avoir, ce qui est vraiment deux questions:
- Ces constantes spécifiques à une seule classe, ou est-il judicieux de les avoir tous sur l'application?
- Si elles sont spécifiques à la classe, sont-ils pour une utilisation par les clients de la classe, ou seulement au sein de la classe?
Si elles sont spécifiques et internes à une classe unique, déclarer que static const
en haut de l' .m de fichier, comme ceci:
static NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
Si elles se rapportent à une seule classe, mais doit être public ou utilisé par d'autres classes, de les déclarer comme extern
dans l'en-tête et de le définir dans le .m:
//.h
extern NSString *const MyThingNotificationKey;
//.m
NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
Si ils devraient être global, de les déclarer dans un en-tête et de le définir dans un module correspondant, spécifiquement pour ces constantes.
Vous pouvez mélanger et assortir pour ces différentes constantes avec les différents niveaux de la façon dont le vous le souhaitez, et pour les différentes constantes globales qui n'appartiennent pas au même temps-vous pouvez les mettre dans des modules distincts, chacun avec son propre en-tête, si vous le souhaitez.
Pourquoi ne pas #define
?
Le vieux la réponse est "macros n'ont pas le type de l'information", mais les compilateurs d'aujourd'hui sont assez intelligents à faire tout le type de vérification pour les littéraux (macros étendre à d') ainsi que les variables.
La réponse moderne est parce que le débogueur ne savez pas à propos de vos macros. Vous ne pouvez pas dire [myThing addObserver:self forKey:MyThingNotificationKey]
dans un débogueur de commande si MyThingNotificationKey
est une macro; le débogueur ne peut savoir si c'est une variable.
Pourquoi ne pas enum
?
Eh bien, rmaddy me battre pour elle dans les commentaires: enum
n'est possible de définir des constantes entières. Des choses comme la série de codes d'identification, de bits, les masques, les quatre octets de codes, etc.
À ces fins, enum
est grand et vous absolument devez l'utiliser. (Mieux encore, utiliser l' NS_ENUM
et NS_OPTIONS
macros.) Pour d'autres choses, vous devez utiliser quelque chose d'autre; enum
ne pas faire quelque chose mais entiers.
Et d'autres questions
Je pensais à propos de l'importation du fichier dans le Reddit de Préfixe.pch fichier pour rendre les constantes disponibles pour tous les fichiers. Est-il une bonne façon de faire les choses?
Probablement inoffensifs, mais probablement excessifs. Importer vos constantes de l'en-tête(s) où vous en avez besoin.
Quels sont les cas d'utilisation pour chacune de ces solutions?
-
#define
: Assez limité. Je suis franchement pas sûr qu'il y a une bonne raison de l'utiliser pour les constantes plus.
-
const
: Mieux pour les constantes. Aussi, vous devez l'utiliser que pour un seul, vous avez déclaré dans un en-tête et sont désormais définir.
-
static const
: Le meilleur pour un fichier spécifique (ou la classe) constantes.
-
extern const
: Vous devez l'utiliser lors de l'exportation d'une constante dans un en-tête.
Aussi, si vous utilisez extern const
, ai-je besoin pour importer le fichier, ou les constantes seront disponibles dans le monde sans importer le fichier?
Vous devez importer le fichier, soit dans chaque fichier là où vous l'utilisez ou dans le préfixe en-tête.