Большинство моделей в моем приложении для iOS запрашивают веб-сервер. Я хотел бы иметь файл конфигурации, в котором хранится базовый URL-адрес сервера. Это будет выглядеть примерно так:
// production
// static NSString* const baseUrl = "http://website.com/"
// testing
static NSString* const baseUrl = "http://192.168.0.123/"
Комментируя ту или иную строку, я могу мгновенно изменить сервер, на который указывают мои модели. У меня вопрос: как лучше всего хранить глобальные константы в iOS? В программировании для Android у нас есть встроенный файл ресурсов строк . В любой деятельности (эквивалент в UIViewController ), мы можем получить эти строковые константы с:
String string = this.getString(R.string.someConstant);
Мне было интересно, есть ли в iOS SDK аналогичное место для хранения констант. Если нет, то что лучше всего сделать в Objective-C?
"constants.h"
подход, объявляяstatic
переменные на основе#ifdef VIEW_CONSTANTS ... #endif
. Таким образом, у меня есть один файл констант для всего приложения, но каждый из других моих файлов кода#define
содержит разные наборы констант, которые нужно включить перед#include
включением файла констант (останавливает все эти предупреждения компилятора "определенные, но не используемые").#decalare
, у меня была ошибка компиляции: « Объявление недопустимой директивы предварительной обработки ». Поэтому я заменил его на#define
. Другая проблема - использование константы. Я хотел создать другую константу сstatic NSString* const fullUrl = [NSString stringWithFormat:@"%@%@", kbaseUrl, @"script.php"]
, но, очевидно, создавать константы с выражением незаконно. Я получаю сообщение об ошибке « элемент инициализатора не является постоянным ».#define kBaseURL @"http://192.168.0.123/";
Что ж, вы хотите, чтобы объявление было локальным для интерфейсов, к которым оно относится - файл констант для всего приложения - это не очень хорошо.
Кроме того, предпочтительнее просто объявить
extern NSString* const
символ, а не использовать#define
:SomeFile.h
SomeFile.m
Помимо отсутствия декларации Extern, совместимой с C ++, это то, что вы обычно увидите в фреймворках Apple Obj-C.
Если константа должна быть видна только одному файлу или функции, то
static NSString* const baseUrl
в вашем случае*.m
это хорошо.источник
@"foo"
не то же самое, что[[NSString alloc] initWithCString:"foo"]
.#define
она используется (т.е. равенство указателя может потерпеть неудачу) - а не то, что буквальное выражение NSString создает временное при каждом выполнении.Как я определяю глобальные константы:
AppConstants.h
AppConstants.m
Затем в вашем файле {$ APP} -Prefix.pch:
Если у вас возникли какие-либо проблемы, сначала убедитесь, что для параметра Precompile Prefix Header установлено значение NO.
источник
Вы также можете объединить строковые константы следующим образом:
источник
Я думаю, что другой способ сделать это намного проще, и вы просто включите его в файлы, в которые они вам нужны, а не ВСЕ файлы, как в случае с файлом префикса .pch:
После этого вы включаете этот файл заголовка в нужный файл заголовка. Вы включаете его в файл заголовка для конкретного класса, в который вы хотите его включить:
источник
"error: use of undeclared identifier .."
#define BASEURl @"http://myWebService.appspot.com/xyz/xx"
затем в любом месте проекта использовать BASEURL:
Обновлено: в Xcode 6 вы не найдете файл .pch по умолчанию, созданный в вашем проекте. Поэтому, пожалуйста, используйте файл PCH в Xcode 6, чтобы вставить файл .pch в свой проект.
Обновления: для SWIFT
& Сразу объявить / определить члена
Пример:
источник
Глобальные объявления интересны, но для меня то, что сильно изменило мой способ программирования, - это наличие глобальных экземпляров классов. Мне потребовалось несколько дней, чтобы по-настоящему понять, как с этим работать, поэтому я быстро резюмировал его здесь.
Я использую глобальные экземпляры классов (1 или 2 на проект, если необходимо), чтобы перегруппировать доступ к основным данным или некоторые логики сделок.
Например, если вы хотите иметь центральный объект, обрабатывающий все столики в ресторане, вы создаете объект при запуске, и все. Этот объект может обрабатывать доступ к базе данных ИЛИ обрабатывать его в памяти, если вам не нужно его сохранять. Он централизован, вы показываете только полезные интерфейсы ...!
Это отличный помощник, объектно-ориентированный и хороший способ собрать все в одном месте.
Несколько строк кода:
и реализация объекта:
для использования это действительно просто:
источник
У принятого ответа есть 2 слабых места. Во-первых, как указывали другие, это использование,
#define
которое труднее отлаживать, вместо этого используйтеextern NSString* const kBaseUrl
структуру. Во-вторых, он определяет один файл для констант. IMO, это неправильно, потому что большинству классов не нужен доступ к этим константам или доступ ко всем из них, плюс файл может стать раздутым, если там объявлены все константы. Лучшим решением было бы разбить константы на 3 разных уровня:Системный уровень:
SystemConstants.h
илиAppConstants.h
который описывает константы в глобальной области видимости, к которым может получить доступ любой класс в системе. Объявите здесь только те константы, к которым должен осуществляться доступ из разных классов, не связанных между собой.Уровень модуля / подсистемы:
ModuleNameConstants.h
описывает набор констант, которые типичны для набора связанных классов внутри модуля / подсистемы.Слой класса: Константы находятся в классе и используются только им.
Только 1,2 имеют отношение к вопросу.
источник
Подход, который я использовал раньше, - это создать файл
Settings.plist
и загрузить егоNSUserDefaults
при запуске с помощьюregisterDefaults:
. Затем вы можете получить доступ к его содержимому с помощью следующего:Хотя я не занимался разработкой Android, похоже, что это аналог описанного вами файла ресурсов строк. Единственным недостатком является то, что вы не можете использовать препроцессор для переключения между настройками (например, в
DEBUG
режиме). Я полагаю, вы могли бы загрузить другой файл.NSUserDefaults
документация.источник
NSString
,NSNumber
и т. Д.). Конечно, вы можете обернуть свои#define
s, чтобы сделать то же самое, но тогда их не так легко редактировать. Интерфейсplist
редактирования тоже хорош. :) Хотя я согласен с тем, что вы не должны помещать туда суперсекретные вещи, такие как ключи шифрования, меня не слишком беспокоят пользователи, которые ковыряются в местах, где им быть не должно - если они сломают приложение, это их собственная вина .#define
s, чтобы вернуть правильный тип, но я привык редактировать такие файлы констант, поскольку я всегда учился помещать такие глобальные константы в отдельный файл констант еще с тех дней, когда я изучал Паскаль. на старом 286 :) А что касается юзера, который везде ковыряется, я тоже согласен, это их вина. На самом деле, это просто вопрос вкуса.Для числа вы можете использовать это как
источник
Я бы использовал объект конфигурации, который инициализируется из файла
plist
. Зачем беспокоить другие классы ненужными внешними вещами?Я создал
eppz!settigns
единственную по этой причине. См. Статью Расширенный, но простой способ сохранения в NSUserDefaults для включения значений по умолчанию из файлаplist
.источник