7

Почему не эта работа:Почему я не могу использовать NSInteger в инструкции switch?

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

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

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

error: case label does not reduce to an integer constant

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

ответ

10

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

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

Используйте перечисленный тип или #defines.

2

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

ли что-то вроде

#define SOME_VALUE 1 

или

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

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

+0

Так что придется прибегнуть к тому, если-иначе-если-то еще раз? Разве это не так? – Rits

+0

Да, использование определяет, в чем проблема с этим? : D – fresskoma

4

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

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

int intSection = section; 

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

Если значения случае действительно изменить во время выполнения, это то, что если ... иначе, если ... иначе, если конструкт там.

-2

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

switch((int)secion)