8

なぜこれが機能しないのですか?

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

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

このコンパイルエラーが発生します:

エラー:ケースラベルが整数定数に縮小されない

このようなNSIntegerを使用することはできませんか?もしそうなら、switchステートメントのケースとして変数を使用する別の方法はありますか?sectionLocationなどには可変値があります。

4

5 に答える 5

11

問題はスカラー型ではありませんが、そのような変数の場合、ケースラベルの値が変わる可能性があります。

すべての目的と目的のために、コンパイラーはswitchステートメントを一連のgotoとしてコンパイルします。ラベルを可変にすることはできません。

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

于 2011-01-08T19:13:47.863 に答える
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:
        //
}
于 2011-01-08T19:14:42.050 に答える
2

ここでの問題は、変数を使用していることです。switchステートメントでのみ定数を使用できます。

次のようなことをします

#define SOME_VALUE 1

また

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

また、switchステートメントでvalueaなどを使用できるようになります。

于 2011-01-08T19:12:17.167 に答える
1

実行時にケースの値が本当に変更される場合は、if ... else if ...elseif構文があります。

于 2011-01-08T19:25:32.810 に答える
-2

または単にこれを行う

switch((int)secion)
于 2011-01-09T00:05:40.420 に答える