Целочисленная константа не сводится к целому числу '

Я использую этот код для установки моих констант

// Constants.h
extern NSInteger const KNameIndex;

// Constants.m
NSInteger const KNameIndex = 0;

И в операторе switch в файле, который импортирует файл Constant.h, у меня есть следующее:

switch (self.sectionFromParentTable) {
    case KNameIndex:
        self.types = self.facilityTypes;
        break;
    ...

Я получаю ошибку при компиляции, которая читает это: "error: case label не сводится к целочисленной константе"

Любые идеи, которые могут быть испорчены?

Ответ 1

Для C/С++ и Objective-C оператор case имеет фиксированные значения - "сведен к целому числу (прочитанное значение)" во время компиляции

Ваши константы не являются реальной "константой", потому что это переменная, и я думаю, ее можно изменить с помощью указателя - т.е. &KNameIndex

Обычно один определяет константы как enum

enum {
    KNameIndex = 0,
    kAnotherConstant = 42
};

Если вы используете С++ или Objective-C ++ (с расширением .mm как расширение файла), вы можете использовать оператор const как

const int KNameIndex = 0;

Ответ 2

Вы можете использовать

#define KNameIndex 0

...

switch (self.sectionFromParentTable) {
        case KNameIndex:
                self.types = self.facilityTypes;
                break;
        ...

и он должен работать.

У меня была такая же проблема, и я решил перейти С#define, а не enum. Работает для меня и торговли;; -)

Ответ 3

Я не работал с Objective C, но я бы попробовал сбросить "extern". По крайней мере, если это был С++, файл Constants.m не был бы частью блока компиляции Other.m, поэтому значение KNameIndex было бы неизвестно компилятору. Это объясняет ошибку; непознаваемое значение не может быть константой.

Помогает ли это определение, а не только объявление в файле Constants.h?

Ответ 4

Это удар в темноте, потому что я не использовал Cocoa/ObjC в течение длительного времени, но является ли переменной-членом sectionFromParentTable не типа int?

Ответ 5

Я думаю, что вы застряли с использованием const int вместо const NSInteger, поскольку переключатель работает только со встроенными встроенными типами. (не уверен, что ваш синтаксис с const перевернулся после типа).

Посмотрите на связанный с этим вопрос: Objective-C переключатель с использованием объектов?