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

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

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

12
задан Brian Tompsett - 汤莱恩 12 July 2016 в 19:05
поделиться

4 ответа

Создайте свой собственный файл констант, например 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];
34
ответ дан 2 December 2019 в 03:14
поделиться

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

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

8
ответ дан 2 December 2019 в 03:14
поделиться

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

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

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

Также обратите внимание на этот вопрос: Константы в Objective-C

1
ответ дан 2 December 2019 в 03:14
поделиться

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

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

enum {
  kCellSomething = 123,
  kCellAnotherThing = 456,
  ...
};
5
ответ дан 2 December 2019 в 03:14
поделиться