2012-08-13 17 views
11

Eventuali duplicati:
Constants in Objective Ccome dichiarare e utilizzare NSString costanti globali

I memorizzare alcune impostazioni di app in NSUserDefaults. NSStrings sono usati come chiavi. Il problema è che ho bisogno di accedere a queste impostazioni in tutta l'app usando quelle chiavi NSString. C'è una possibilità che io esprima in modo errato tale chiave stringa quando accedo in qualche parte dell'app.

Durante l'applicazione, ho tali dichiarazioni

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

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

Come e dove posso dichiarare una NSString globale costante che posso accedere in tutta l'applicazione. Sarò quindi in grado di utilizzare quella costante senza dovermi preoccupare di scrivere in modo errato quelle chiavi di stringa.

risposta

5

Quello che sembra essere solo un modo per definire le costanti di stringa nella tua app.

Vedi this question e this answer ad esso, che ho citato qui di seguito:

È necessario creare un file di intestazione come

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

È possibile includere questo file in ogni file che utilizza il costanti o nell'intestazione precompilata> per il progetto.

di definire queste costanti in un file .m come

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

Constants.m dovrebbe essere aggiunto al bersaglio l'applicazione/del quadro in modo che sia legato a al prodotto finale.

Il vantaggio di utilizzare le costanti stringa al posto di # costanti define'd è che si può verificare l'uguaglianza utilizzando il confronto puntatore (stringInstance == MyFirstConstant) che è molto più veloce di stringa confronto ([stringInstance isEqualToString:MyFirstConstant]) (e più facile da leggere, IMO).

Con grazie a Barry Wark :)

+0

lui vuole solo le costanti nell'app (interno li nkage) quindi mi chiedo perché stai suggerendo di esportarli (linkage esterno)? – malhal

9

Il tuo pensiero è proprio credo. Ad esempio, ho fatto di file Const.h/m come di seguito:

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"; 

Solo Const.h deve essere importato.

Quando si scrive codice, Xcode supporta la scrittura del nome della chiave in modo da evitare errori di digitazione.

5

Il modo più semplice per eseguire questa operazione è rendere semplice il file .h, come Utils.h e scrivere lì seguente codice:

#define kUserDefaults @"ReminderSwitch"

+3

sì, non è così sicuro, c'è una possibilità per qualche altro file c obiettivo di scavalcarlo senza essere notato :( – thndrkiss

13

In primo luogo, si dovrebbe andare per un vero e proprio simbolo C extern - non una macro. questo è fatto in questo modo:

SomeFile.h

extern NSString *const MONConstantString; 

SomeFile.m

NSString *const MONConstantString = @"MONConstantString"; 

nota che se si utilizza un mix di objC e objC++, è necessario specificare extern "C" per C++ TU: ecco perché vedrai l'esportazione di #define d che varia in base alla lingua.


Quindi, si vorrà mettere la costante vicino alle interfacce a cui si riferisce. Prendendo come esempio il tuo esempio, potresti desiderare una serie di interfacce o dichiarazioni per le preferenze della tua app. In tal caso, è possibile aggiungere la dichiarazione di MONAppsPreferences intestazione:

MONAppsPreferences.h

extern NSString *const MONApps_Pref_ReminderSwitch; 

MONAppsPreferences.m

NSString *const MONApps_Pref_ReminderSwitch = @"MONApps_Pref_ReminderSwitch"; 

In uso:

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