2011-01-08 12 views
7

Warum nicht diese Arbeit:Warum kann ich einen NSInteger nicht in einer switch-Anweisung verwenden?

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

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

ich diesen Fehler Kompilierung:

error: case label does not reduce to an integer constant

Ist es nicht möglich NSInteger ist wie diese zu benutzen? Wenn ja, gibt es eine andere Möglichkeit, Variablen als Fälle in einer switch-Anweisung zu verwenden? sectionLocation usw. haben variable Werte.

Antwort

10

Das Problem ist nicht der Skalartyp, aber die Case-Labels können den Wert ändern, wenn sie Variablen wie diese sind.

Der Compiler kompiliert in jeder Hinsicht eine switch-Anweisung als eine Menge von gotos. Die Beschriftungen können nicht variabel sein.

Verwenden Sie einen Aufzählungstyp oder #defines.

2

Das Problem hier ist, dass Sie Variablen verwenden. Sie können nur Konstanten in switch-Anweisungen verwenden.

Sie so etwas wie

#define SOME_VALUE 1 

oder

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

Und Sie werden in der Lage sein Werta zu verwenden und so weiter in der switch-Anweisung.

+0

tun Also werde ich if-else-if-else zurückgreifen müssen wieder? Gibt es dafür keinen Weg? – Rits

+0

Ja, verwenden definiert, was ist das Problem? : D – fresskoma

4

Der Grund ist, dass der Compiler oft eine 'Jump-Tabelle' erstellen will, die den Switch-Wert als Schlüssel in diese Tabelle verwendet und das nur tun kann, wenn ein einfacher Integer-Wert eingeschaltet wird. Dies soll stattdessen arbeiten:

#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

Wenn Ihr Fall Werte wirklich zur Laufzeit ändern, das ist, was die if ... else if ... else if-Konstrukt ist da.

-2

oder gerade diese

switch((int)secion)