2012-08-13 23 views
11

Duplicar posibles:
Constants in Objective CCómo declarar y utilizar NSString constantes globales

almaceno algunos configuración de la aplicación en NSUserDefaults. NSStrings se utilizan como claves. El problema es que necesito acceder a esta configuración en toda la aplicación usando esas claves NSString. Existe la posibilidad de que escriba incorrectamente dicha clave de cadena al acceder en alguna parte de la aplicación.

A lo largo de la aplicación, que tienen tales declaraciones

[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"ReminderSwitch"]; 

BOOL shouldRemind = [[NSUserDefaults standardUserDefaults] boolForKey:@"ReminderSwitch"]; 

¿Cómo y dónde puedo declarar una constante NSString global que puedo tener acceso a lo largo de la aplicación. Entonces podré usar esa constante sin preocuparme por escribir mal las claves de cadena.

Respuesta

5

Lo que pareces estar buscando es solo una manera de definir las constantes de cadena en tu aplicación.

Ver this question y this answer a ella, que he citado a continuación:

Debe crear un archivo de cabecera como

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

Puede incluir este archivo en cada archivo que utiliza el constantes o en el encabezado precompilado> para el proyecto.

Para definir estas constantes en un archivo .m como

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

Constants.m deben añadirse al objetivo de su aplicación/de marco para que se una en el producto final.

La ventaja de utilizar constantes de cadena en lugar de # constantes que se defina es que se puede comprobar la igualdad mediante la comparación puntero (stringInstance == MyFirstConstant) que es mucho más rápido que la cadena comparación ([stringInstance isEqualToString:MyFirstConstant]) (y más fácil de leer, la OMI).

Con gracias a Barry Wark :)

+0

él solo quiere las constantes en la aplicación (li interno nkage) así que me pregunto por qué estás sugiriendo que los exporte (enlace externo)? – malhal

9

Su pensamiento es correcto, creo. Por ejemplo, hice Const.h/m archivo, como a continuación:

Const.h

extern NSString *const UserIdPrefKey; 
extern NSString *const PasswordPrefKey; 
extern NSString *const HomepagePrefKey; 

Const.m

#import "AEConst.h" 

NSString *const UserIdPrefKey = @"UserIdPrefKey"; 
NSString *const PasswordPrefKey = @"PasswordPrefKey"; 
NSString *const HomepagePrefKey = @"UrlHomepagePrefKey"; 

Sólo Const.h debe ser importado.

Cuando escribe código, Xcode admite escribir el nombre de la clave para que pueda evitar el error de tipeo.

5

La manera más fácil de hacerlo es crear archivos .h simples, como Utils.h y escribir allí siguiente código:

#define kUserDefaults @"ReminderSwitch"

+3

Sí, no tan seguro, existe la posibilidad de que algún otro archivo c objetivo anule eso sin que se note :( – thndrkiss

13

En primer lugar, hay que ir por un símbolo C Real extern - no una macro. esto se hace así:

SomeFile.h

extern NSString *const MONConstantString; 

SomeFile.m

NSString *const MONConstantString = @"MONConstantString"; 

nota que si se utiliza una mezcla de ObjC y ObjC++, tendrá que especificar extern "C" para C++ TUs - es por eso que verá una exportación de #define d que varía según el idioma.


Luego, querrá poner la constante cerca de las interfaces a las que se refiere. Tomando su ejemplo como un líder, es posible que desee un conjunto de interfaces o declaraciones para las preferencias de su aplicación. En ese caso, es posible añadir a la declaración MONAppsPreferences cabecera:

MONAppsPreferences.h

extern NSString *const MONApps_Pref_ReminderSwitch; 

MONAppsPreferences.m

NSString *const MONApps_Pref_ReminderSwitch = @"MONApps_Pref_ReminderSwitch"; 

En uso:

#import "MONAppsPreferences.h" 
... 
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:MONApps_Pref_ReminderSwitch]; 
Cuestiones relacionadas