1031 votes

Constantes dans l'objectif C

Je développe une application Cocoa et j'utilise NSString s comme moyen de stocker les noms de clés pour mes préférences.

Je comprends que c'est une bonne idée car cela permet de changer facilement de clés si nécessaire. De plus, c'est l'ensemble de la notion de «séparer vos données de votre logique».

Quoi qu'il en soit, existe-t-il un bon moyen de définir ces constantes une fois pour l'ensemble de l'application? Je suis sûr qu'il y a un moyen facile et intelligent, mais en ce moment mes cours redéfinissent ceux qu'ils utilisent.

1303voto

Barry Wark Points 73462

Vous devez créer un fichier d'en-tête comme

// Constants.h
FOUNDATION_EXPORT NSString *const MyFirstConstant;
FOUNDATION_EXPORT NSString *const MySecondConstant;
//etc.

(vous pouvez utiliser extern au lieu de FOUNDATION_EXPORT si votre code ne sera pas utilisé en mixte C/C++ environnements ou sur d'autres plates-formes)

Vous pouvez inclure ce fichier dans chaque fichier qui utilise les constantes ou dans l'en-tête précompilé pour le projet.

Vous définissez ces constantes dans un .m comme fichier

// Constants.m
NSString *const MyFirstConstant = @"FirstConstant";
NSString *const MySecondConstant = @"SecondConstant";

Les constantes.m devrait être ajouté à votre application/du cadre de cible de sorte qu'il est lié à la qualité du produit final.

L'avantage d'utiliser des constantes de chaîne au lieu de #define'd des constantes c'est que vous pouvez tester l'égalité à l'aide du pointeur de la comparaison (stringInstance == MyFirstConstant) qui est beaucoup plus rapide que la comparaison de chaînes de caractères ([stringInstance isEqualToString:MyFirstConstant]) (afin de faciliter la lecture, de l'OMI).

282voto

Andrew Grant Points 35305

Moyen le plus simple:

 // Prefs.h
#define PREFS_MY_CONSTANT @"prefs_my_constant"
 

Meilleure façon:

 // Prefs.h
extern NSString * const PREFS_MY_CONSTANT;

// Prefs.m
NSString * const PREFS_MY_CONSTANT = @"prefs_my_constant";
 

Un avantage de la seconde est que la modification de la valeur d'une constante ne provoque pas une reconstruction de votre programme entier.

192voto

kompozer Points 1273

Il y a aussi une chose à mentionner. Si vous avez besoin d'un non constante globale, vous devez utiliser static mot-clé.

Exemple

// In your *.m file
static NSString * const kNSStringConst = @"const value";

En raison de l' static mot-clé, ce const n'est pas visible à l'extérieur du fichier.


Petite correction: les variables statiques sont visibles à l'intérieur d'une unité de compilation. Généralement, c'est une seule .m de fichier (comme dans cet exemple), mais il peut vous mordre si vous le déclarer dans un en-tête qui est inclus d'ailleurs, puisque vous obtiendrez des erreurs d'édition de liens après la compilation

117voto

Victor Van Hee Points 3076

L'acceptés (et corriger) réponse dit que "vous pouvez inclure cette [Constantes.h] fichier... dans l'en-tête précompilé pour le projet." En tant que novice, j'ai eu de la difficulté à le faire sans plus d'explications -- voici comment faire: Dans votre YourAppNameHere-Préfixe.pch fichier (c'est le nom par défaut de l'en-tête précompilé dans XCode), l'importation de Constantes.h à l'intérieur de l' #ifdef __OBJC__ bloc.

#ifdef __OBJC__
  #import <UIKit/UIKit.h>
  #import <Foundation/Foundation.h>
  #import "Constants.h"
#endif

Notez également que les Constantes.h et Constantes.m les fichiers doivent contenir absolument rien d'autre à l'exception de ce qui est décrit dans la accepté de répondre. (Pas d'interface ou de mise en œuvre).

50voto

Krizz Points 7273

Je suis généralement à l'aide de la façon posté par Barry Wark et Rahul Gupta.

Bien que, je n'aime pas répéter les mêmes mots dans les deux .h et .m de fichier. Notez que dans l'exemple suivant, la ligne est presque identique dans les deux fichiers:

// file.h
extern NSString* const MyConst;

//file.m
NSString* const MyConst = @"Lorem ipsum";

Donc, ce que j'aime faire est d'utiliser un préprocesseur C des machines. Je m'explique par l'exemple.

J'ai un fichier d'en-tête qui définit la macro STR_CONST(name, value):

// StringConsts.h
#ifdef SYNTHESIZE_CONSTS
# define STR_CONST(name, value) NSString* const name = @ value
#else
# define STR_CONST(name, value) extern NSString* const name
#endif

La dans mon .h/.m paire où je veux définir la constante je ne les suivants:

// myfile.h
#import <StringConsts.h>

STR_CONST(MyConst, "Lorem Ipsum");
STR_CONST(MyOtherConst, "Hello world");

// myfile.m
#define SYNTHESIZE_CONSTS
#import "myfile.h"

et voila, j'ai toutes les informations sur les constantes .h seulement.

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