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

Почему я не могу использовать мою константу в операторе 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, поэтому я не вижу проблемы...

Спасибо за вашу помощь!

4b9b3361

Ответ 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 является завершение кода и проверка компилятора