2011-01-08 33 views
7

しないのはなぜこの作品:switch文でNSIntegerを使用できないのはなぜですか?

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文の中で変数をcaseとして使う別の方法がありますか? sectionLocationなどは可変値を有する。

答えて

10

問題はスカラー型ではありませんが、大文字と小文字のラベルは、そのような変数の場合に値を変更する可能性があります。

すべての目的と目的のために、コンパイラはswitch文を一連のgotopとしてコンパイルします。ラベルは可変ではありません。

列挙型または#definesを使用します。

2

ここで問題となるのは、変数を使用することです。 switch文には定数しか使用できません。

#define SOME_VALUE 1 

または

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

ような何かを行うと、あなたはあなたのswitch文でなどvalueaとを使用することができるようになります。

+0

だから私はのif-else-IF-ELSE再びに頼る必要があるでしょうか?これを回避する方法はありませんか? – 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

実行時に大文字と小文字の値が実際に変更された場合、if ... else if ... else if construct if there。

-2

か、単にこれは

switch((int)secion) 
関連する問題