Как объявить и использовать глобальные константы NSString

Возможный дубликат:
Константы в Objective C

Я храню некоторые настройки приложения в NSUserDefaults. В качестве ключей используются NSStrings. Проблема в том, что мне нужно получить доступ к этим настройкам во всем приложении, используя эти клавиши NSString. Есть вероятность, что я ошибаюсь при использовании такого строкового ключа при доступе в какой-то части приложения.

Во всем приложении у меня есть такие утверждения

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

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

Как и где я могу объявить глобальную константу NSString, доступную во всем приложении. Затем я смогу использовать эту константу, не беспокоясь о том, чтобы опечатать эти строковые ключи.

Ответ 1

Во-первых, вы должны пойти на реальный внешний символ C - не макрос. это делается следующим образом:

SomeFile.h

extern NSString *const MONConstantString;

SomeFile.m

NSString *const MONConstantString = @"MONConstantString";

обратите внимание, что если вы используете сочетание ObjC и ObjС++, вам нужно указать extern "C" для С++ TU - поэтому вы увидите экспорт #define d, который зависит от языка.


Затем вам нужно будет поместить константу рядом с интерфейсами, к которым она относится. Взяв ваш пример в качестве примера, вам может потребоваться набор интерфейсов или объявлений для ваших настроек приложения. В этом случае вы можете добавить объявление в заголовок MONAppsPreferences:

MONAppsPreferences.h

extern NSString *const MONApps_Pref_ReminderSwitch;

MONAppsPreferences.m

NSString *const MONApps_Pref_ReminderSwitch = @"MONApps_Pref_ReminderSwitch";

При использовании:

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

Ответ 2

Твоя мысль правильная, я думаю. Например, я сделал файл Const.h/m, как показано ниже:

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

Необходимо импортировать только Const.h.

Когда вы пишете код, Xcode поддерживает запись имени ключа, чтобы можно было избежать пропусков.

Ответ 3

То, что вы, похоже, ищете, - это просто способ определения строковых констант в вашем приложении.

Смотрите этот вопрос и этот ответ, который я привел ниже:

Вам следует создать файл заголовка, например

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

Вы можете включить этот файл в каждый файл, который использует константы или в предварительно скомпилированном заголовке > для проекта.

Вы определяете эти константы в файле .m, например

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

Константы .m должны быть добавлены в ваш целевой объект application/framework, чтобы он был связан с конечным продуктом.

Преимущество использования строковых констант вместо # define'd констант заключается в том, что вы можете проверить равенство, используя сравнение указателей (stringInstance == MyFirstConstant), который намного быстрее, чем строка сравнение ([stringInstance isEqualToString:MyFirstConstant]) (и легче читать, ИМО).

Благодаря Барри Уорку:)

Ответ 4

Самый простой способ сделать это - сделать простой файл .h, например Utils.h, и написать там следующий код:

#define kUserDefaults @"ReminderSwitch"