Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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