Почему я не могу использовать мою константу в операторе switch-case в Objective-C? [error = Expression не является целочисленным постоянным выражением]
Итак, у меня проблема с использованием постоянной переменной в следующем операторе switch в Objective-C.
У меня Constants.h со следующим:
// Constants.h
extern NSInteger const TXT_NAME;
И Константы .m как:
// Constants.m
#import "Constants.h"
NSInteger const TXT_NAME = 1;
Затем в TabBasic.m Я пытаюсь использовать эту константу в операторе switch-case:
// TabBasic.m
#import "TabBasic.h"
#import "Constants.h"
... code ...
- (IBAction)saveValue:(id)sender {
if ([sender isKindOfClass: [UITextField class]]) {
UITextField *txtField = (UITextField *) sender;
switch (txtField.tag) {
case TXT_NAME:
NSLog(@"Set property name to: %@", txtField.text);
break;
}
}
}
Но, к сожалению, это дает мне следующие две ошибки в строке "case TXT_NAME:":
- Выражение не является целым константным выражением
- Метка Case не сводится к целочисленной константе
Кто-нибудь знает, что я делаю неправильно? Переменная "tag" UITextField возвращает NSInteger, поэтому я не вижу проблемы...
Спасибо за вашу помощь!
Ответы
Ответ 1
Быстрое решение, вы должны поместить NSInteger const TXT_NAME = 1;
в Constants.h и ничего не нужно в Constants.m.
Причина. Если вы задаете значение константы в .m, это не видно другим единицам перевода, которые включают только файл .h. Значение константы должно быть известно во время компиляции для использования в case
в пределах switch
.
Update:
Вышеупомянутое работает при компиляции в Objective-C ++. Вам нужно, чтобы ваши файлы заканчивались на .mm
вместо .m
для их компиляции в Objective-C ++ вместо Objective-C.
Чтобы работать в Objective-C, вы должны определить свою константу так:
#define TXT_NAME 1
Или даже лучше, например:
enum {TXT_NAME = 1};
Ответ 2
Я обычно буду следить за тем, что Apple, похоже, делает и определяет перечисление typedef в файле .h, как это.
typedef NS_ENUM(NSInteger, PSOption) {
PSOption1,
PSOption2,
PSOption3,
PSOption4,
};
Затем вы можете использовать его в своем случае и даже передавать его в функции, а также тип, например.
- (void)myMethod:(PSOption)option;
Дополнительным преимуществом этого при использовании #define
является завершение кода и проверка компилятора