Константы класса - PullRequest
       9

Константы класса

12 голосов
/ 04 марта 2010

У меня есть несколько классов obj-c, для каждого из которых требуется ряд констант, которые используются в выражениях switch.

Я пытался определить эти числовые константы в файле .m, используя инструкцию препроцессора #define. Все эти константы начинаются с «kCell». Кажется, это работает хорошо, но смысл кода XCode представляет мне каждую константу с префиксом «kCell», где бы я ни был в проекте. Константы #define имеют глобальную область видимости? Если это так, каков наилучший способ определения чисто локальных констант классов, которые не будут классифицироваться с константами с аналогичными именами в других классах?

Ответы [ 4 ]

34 голосов
/ 04 марта 2010

Создайте свой постоянный файл, например, 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];
8 голосов
/ 04 марта 2010

Обычно я считаю, что перечисления лучше всего использовать для переключателей:

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 могут быть лучшими способами назвать ваши константы.

5 голосов
/ 04 марта 2010

Константы #define существуют только в файле .m.

Если константы являются целыми числами, их можно также определить в enum:

enum {
  kCellSomething = 123,
  kCellAnotherThing = 456,
  ...
};
1 голос
/ 04 марта 2010

Кажется, это работает хорошо, но смысл кода XCode представляет меня с каждой константой с префиксом kCell независимо от того, где я нахожусь в проекте. Имеют ли константы #define глобальную область видимости? Если да, то как лучше определить чисто локальные константы классов, которые не будут классифицироваться с константами с аналогичными именами в других классах?

Значения Xcode Code Sense и Runtime не идентичны. Xcode также предлагает selectorNames и другие элементы, которые не видны во время выполнения.

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

Также взгляните на этот вопрос: Константы в Objective-C

...