Почему я не могу использовать NSInteger в операторе switch? - PullRequest
8 голосов
/ 08 января 2011

Почему это не работает:

NSInteger sectionLocation = 0;
NSInteger sectionTitles = 1;
NSInteger sectionNotifications = 2;

switch (section) {
    case sectionLocation:
        //
        break;
    case sectionTitles:
        //
        break;
    case sectionNotifications:
        // 
        break;
    default:
        //
}

Я получаю эту ошибку компиляции:

ошибка: метка регистра не сводится к целой константе

Разве нельзя использовать NSInteger, как это?Если да, есть ли другой способ использовать переменные в качестве наблюдений в операторе switch?sectionLocation и т. Д. Имеют значения переменных.

Ответы [ 5 ]

11 голосов
/ 08 января 2011

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

Для всех намерений и целей, компилятор компилирует оператор switch как набор gotos. Метки не могут быть переменными.

Используйте перечисляемый тип или # определяет.

4 голосов
/ 08 января 2011

Причина в том, что компилятор часто захочет создать «таблицу переходов», используя значение ключа в качестве ключа в этой таблице, и он может сделать это только при включении простого целочисленного значения.Это должно работать вместо:

#define sectionLocation  0
#define sectionTitles  1
#define sectionNotifications 2

int intSection = section;

switch (intSection) {
    case sectionLocation:
        //
        break;
    case sectionTitles:
        //
        break;
    case sectionNotifications:
        // 
        break;
    default:
        //
}
2 голосов
/ 08 января 2011

Проблема здесь в том, что вы используете переменные.Вы можете использовать только константы в выражениях switch.

Сделайте что-то вроде

#define SOME_VALUE 1

или

enum Values {
    valuea = 1,
    valueb = 2,
    ...
}

И вы сможете использовать valuea и так далее в своемоператор switch.

1 голос
/ 08 января 2011

Если ваши значения case действительно меняются во время выполнения, это то, для чего if ... else if ... else if construct существует.

0 голосов
/ 09 января 2011

или просто сделай это

switch((int)secion)
...