Почему я не могу использовать свою константу в операторе switch-case в Objective-C? [ошибка = выражение не является целочисленным константным выражением] - PullRequest
14 голосов
/ 05 июля 2011

Итак, у меня проблема с использованием постоянной переменной в следующем операторе switch в Objective-C.

У меня есть Constants.h со следующим:

// Constants.h    
extern NSInteger const TXT_NAME;

А Константы.м как:

// 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:" мне выдаются следующие две ошибки:

  • Выражение не является целочисленным константным выражением
  • Метка регистра не сводится к целочисленной константе

Кто-нибудь знает, что я делаю не так? Переменная «tag» UITextField возвращает NSInteger, поэтому я не вижу проблемы ...

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

Ответы [ 2 ]

20 голосов
/ 05 июля 2011

Быстрое решение, вы должны поместить NSInteger const TXT_NAME = 1; в Constants.h, и ничего не нужно в Constants.m.

Причина: если вы установите значение константы в .m, ононевидим для других модулей перевода, которые включают только файл .h.Значение константы должно быть известно во время компиляции, чтобы ее можно было использовать в case в switch.

Обновление:

Вышеописанное работает при компиляции в Objective-C ++.Ваши файлы должны заканчиваться на .mm вместо .m, чтобы их можно было скомпилировать в Objective-C ++ вместо Objective-C.

Для работы в Objective-C вы должны определитьконстанта либо так:

#define TXT_NAME 1

Или даже лучше, вот так:

enum {TXT_NAME = 1};

10 голосов
/ 06 июля 2011

Обычно я следую действиям Apple и определяю перечисление typedef в файле .h следующим образом.

typedef NS_ENUM(NSInteger, PSOption) {
  PSOption1,
  PSOption2,
  PSOption3,
  PSOption4,
};  

Затем вы можете использовать его в своем выражении case и даже передать его в функции, а также в тип, например,

- (void)myMethod:(PSOption)option;

Еще одним преимуществом этого по сравнению с #define является завершение кода и проверка компилятором

...