У меня есть несколько классов obj-c, для каждого из которых требуется ряд констант, которые используются в выражениях switch.
У меня было попытался определить эти числовые константы в файле .m, используя инструкцию препроцессора #define
. Все эти константы начинаются с «kCell». Кажется, это работает хорошо, но смысл кода XCode представляет меня с каждым Константа с префиксом kCell независимо от того, где я нахожусь в проекте. Имеют ли константы #define
глобальную область видимости? Если да, то как лучше определить чисто локальные константы классов, которые не будут классифицироваться с константами с аналогичными именами в других классах?
Создайте свой собственный файл констант, например MyConstants.
В MyConstants.h объявите все ваши константы:
static const int kRedisplayTileCount = 5 ;
extern NSString* const kCellTitleKey;
, а в MyConstants.m определите их
NSString* const kCellTitleKey = @"CellTitle";
Сохраняя константы в отдельном файле, вам будет легко отслеживать их и изменять их значения.
Это лучший способ определить чисто константы. И это также позволит избежать дублирования ключей.
Вам нужно только импортировать этот класс в другие классы:
#import "MyConstants.h"
и сразу же использовать эти ключи:
obj = [[NSUserDefaults standardUserDefaults] integerForKey: kCellTitleKey];
Обычно я считаю, что перечисления лучше всего использовать для переключателей:
typedef enum {
kCellConstantOne = 1,
kCellConstantTwo = 2, //...
} kCellConstants;
/* later */
- (void)foo:(kCellConstant)constant {
switch (constant) {
case kCellConstantOne:
//do something
break;
case kCellConstantTwo:
//do something else
break;
}
}
К сожалению, xCode не ограничивает смысл кода (завершение кода, автозаполнение) каким-либо конкретным файлом. Он пытается выяснить, какие константы доступны из каких областей вашего кода, но я заметил, что это не на 100% точно.
Я бы посоветовал не начинать их все с одного и того же префикса. Например, если у вас есть два разных типа ячеек таблицы, kCustomCell и kOtherCell могут быть лучшими способами называть ваши константы.
Кажется, это работает хорошо, но чувство кода Xcode представляет мне каждую константу с префиксом kCell независимо от того, где я нахожусь в проекте. Имеют ли константы #define глобальную область видимости? Если да, то как лучше всего определить чисто локальные константы класса, которые не будут классифицироваться с константами с одинаковыми именами в других классах?
Xcode Code Sense и доступность среды выполнения не идентичны. Xcode также предлагает selectorNames и другие элементы, которые не видны во время выполнения.
Все, что определено в файле .m, является локальным во время выполнения.
Также обратите внимание на этот вопрос: Константы в Objective-C
Константы #define
существуют только в файле .m
.
Если константы являются целыми числами, вы также можете определить их в enum
:
enum {
kCellSomething = 123,
kCellAnotherThing = 456,
...
};