Константы классов
У меня есть несколько классов obj-c, каждый из которых требует нескольких констант, которые используются в операторах switch.
Я попытался определить эти числовые константы в файле .m с помощью инструкции препроцессора #define
. Все эти константы начинаются с "kCell". Кажется, что это работает хорошо, но смысл кода Xcode представляет меня с каждой константой префикса kCell, независимо от того, где я нахожусь в проекте. У констант #define
есть глобальная область действия? Если да, то каков наилучший способ определить чисто локальные константы класса, которые не будут классифицировать с одинаковыми именованными константами в других классах?
Ответы
Ответ 1
Имейте свой собственный постоянный файл, например 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];
Ответ 2
Я обычно считаю, что перечисления лучше всего использовать для коммутаторов:
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 могут быть лучшими способами для обозначения ваших констант.
Ответ 3
Константы #define
существуют только в файле .m
.
Если константы являются целыми числами, вы также можете определить их в enum
:
enum {
kCellSomething = 123,
kCellAnotherThing = 456,
...
};
Ответ 4
Кажется, что это хорошо работает, но смысл кода в коде Xcode представляет мне каждую префиксную константу kCell независимо от того, где я нахожусь в проекте. У констант #define есть глобальная область действия? Если да, то каков наилучший способ определить чисто локальные константы класса, которые не будут классифицировать с одинаковыми именованными константами в других классах?
Доступность кода и времени выполнения кода Xcode не идентичны. Xcode также предлагает selectorNames и другие элементы, которые не отображаются во время выполнения.
Все, что определено в файле .m, является локальным во время выполнения.
Также посмотрите на этот вопрос:
Константы в Objective-C