2012-06-27 4 views
3

Есть ли способ использовать глобальные int-константы в Objective C, которые работают в случае case/switch? Методика здесь (http://stackoverflow.com/questions/538996/constants-in-objective-c) позволяет мне получить доступ к константам повсюду, но не позволяет мне помещать их в оператор switch.Objective C глобальные константы с case/switch

в .h

FOUNDATION_EXPORT const int UNIT_IDLE; 
FOUNDATION_EXPORT const int UNIT_DEFEND; 

в .м

int const UNIT_IDLE = 0; 
int const UNIT_DEFEND = 1; 

Ошибка "Выражение не является целым константным выражением"

+0

Как выглядит ваш 'переключатель'? – pb2q

+0

Возможный дубликат [целочисленная константа does 'не сводится к целому числу'] (http://stackoverflow.com/questions/554419/integer-constant-does-not-reduce-to-an-integer) – zpasternack

+0

Я видел это решение , и я довольно новый, поэтому я, вероятно, просто не понимаю, но я не знаю, как получить доступ к моему перечислению в Object 1 в Object2. – Andrew

ответ

5

Обычно я использую перечисления с инструкциями typedef при использовании констант, которые я буду использовать в инструкции switch.

Например, это будет в общем файле .h, такие как ProjectEnums.h:

enum my_custom_unit 
{ 
    MyCustomUnitIdle = 1, 
    MyCustomUnitDefend = 2 
}; 
typedef enum my_custom_unit MyCustomUnit; 

можно затем использовать код, подобный следующему оператору коммутатора в моем .c, .m, .cpp файлы:

#import "ProjectEnums.h" 

- (void) useUnit:(MyCustomUnit)unit 
{ 
    switch(unit) 
    { 
     case MyCustomUnitIdle: 
     /* do something */ 
     break; 

     case MyCustomUnitDefend: 
     /* do something else */ 
     break; 

     default: 
     /* do some default thing for unknown unit */ 
     break; 
    }; 
    return; 
}; 

Это также позволяет компилятору проверять данные, передаваемые методу и используемые в инструкции switch во время компиляции.

+0

Я немного плотный, но из другого объекта я могу получить доступ к enum my_custom_unit? Или мне нужно скопировать-вставить перечисление? Я хочу, чтобы константы поделились. – Andrew

+0

@Andrew Вы можете объявить перечисления в общем файле заголовка. Обычно я создаю файл, называемый ProjectEnumerations.h, который включен в любой из исходных файлов, которые будут использовать перечисления. Я обновил свои примеры, чтобы продемонстрировать. –

+0

Большое спасибо! Мне не хватало последней части того, как делиться перечислениями. – Andrew

1

Я думаю, лучшим вариантом является использование enum types. Просто объявите тип в своем файле заголовка, а затем вы готовы использовать его в инструкции switch.

class.h

typedef enum{ 
    kEditGameModeNewGame = 0, 
    kEditGameModeEdit = 1 
}eEditGameMode; 

class.m

eEditGameMode mode = kEditGameModeEdit; 

switch (mode) { 
    case kEditGameModeEdit: 
     // ... 
     break; 
    case kEditGameModeNewGame: 
     // ... 
     break; 

    default: 
     break; 
} 

Успехов!

+0

Есть ли способ поделиться перечислением между разными объектами? Благодаря! – Andrew

0

Official guideline говорит, что вы должны использовать «перечисления для групп связанных констант, которые имеют целые значения». Это может решить вашу проблему и улучшить код.

Смежные вопросы