Objective-C: перечисление как Java (значения int и многие другие для каждого перечисления) - PullRequest
0 голосов
/ 02 января 2011

В Java вы можете создать перечисление с кратными значениями. В цели C это не может быть легко сделано. Я читал много страниц об этом, но я не нашел ничего удовлетворительного, что позволило бы мне использовать перечисления простым способом и сохранить объявление перечисления и их различные значения в одном файле .

Я бы хотел написать что-то подобное в enums.h:

// ========================================
typedef enum {eRED, eGREEN, eBLUE} ColorEnum;
int colorValues[] = { 0xFF0000, 0x00FF00, 0x0000FF };
NSArray *colorNames = [NSArray arrayWithObjects:@"Red color", @"light green", @"Deep blue", nil];
// ========================================

и сможете использовать эти глобальные переменные для управления моими вещами в любом месте, например:

int color = colorValues[eRED];

Но я не знаю, как это написать. У меня есть ошибки компиляции, такие как "ColorValues", это определяет много раз. Или, если я просто использую «static», у меня есть много «ColorValues», не используемых в файле .m ...

Не могли бы вы мне помочь?

Ответы [ 3 ]

1 голос
/ 02 января 2011

Ваша проблема не имеет ничего общего с перечислением. Проблема заключается в определении переменных в заголовке (а не просто их объявлении). Просто объявите их в заголовке и переместите реализацию в файл реализации.

Кроме того, вы не можете написать [NSArray arrayWithObjects…] вне метода. Здесь разрешены только статические инициализаторы (то есть значения, которые можно определить во время компиляции), тогда как подобные сообщения разрешаются только во время выполнения. Решение состоит в том, чтобы переместить назначение в функцию инициализации (например, init для одиночного или initialize для класса).

1 голос
/ 02 января 2011

Я попробовал следующую вещь, которая работает как шарм:

в enums.h

@interface enums
    // here, the enum and its values are in the same place.

    typedef enum {eRED, eGREEN, eBLUE} ColorEnum;
    #define kColourValue  { 0xFF0000, 0x00FF00, 0x0000FF }
    extern int colourValues[];
@end

в enums.m

@implementation enums
    int colorValues[] = kColourValue;
@end

И у вас есть идеальная реализация перечислений в стиле Java в Objective-C. Ух ты, две недели поисков ....

1 голос
/ 02 января 2011

Вы близки - проблема в том, что вы помещаете определение вашего массива в заголовочный файл, где несколько модулей компиляции в конечном итоге дублируют его. Поставьте свою среднюю линию:

int colorValues[] = { 0xFF0000, 0x00FF00, 0x0000FF };

в один из ваших .m файлов и измените заголовок на:

extern int colourValues[];

Вам нужно будет сделать нечто подобное с colorNames. Измените заголовок на:

extern NSArray *colorNames;

А затем объявите реальный объект и инициализируйте его в файле .m.

...