-6

ここ数時間、私は自分にとって完全に理にかなっているが Xcode にとっては理にかなっている何かをしようとしてきましたが、まだそれを行う方法を見つけていません。それで、ここに行きます。

NSArray *array = [MedInfo getCategoryFirstIndexArray];

ここでgetCategoryFirstIndexArrayは、 のクラス メソッドのみを示しMedInfoます。

@interface MedInfo : NSObject
+(NSArray *)getCategoryFirstIndexArray;
@end

しかし、Xcode はコードにエラーがあり、「式が期待されます」と言い続けていますか?? 面白いこと[MedInfo getCategoryFirstIndexArray];に、コンパイラは問題ないと言っていますが、戻り値を別の変数に代入しようとするとすぐにエラーが発生します。

それで、私はここで何が間違っていますか?求めすぎですか?

編集:わかりました、これはばかげています。次のような switch ステートメント内で新しい変数を作成しようとしています。

switch(self.viewType.integerValue)
{
    case 0:
        break;
    default:
        NSArray *array = [MedInfo getCategoryFirstIndexArray];
        break;
}

どうやら、objective-C がそれをサポートしていないことを知らなかったようです (この恐ろしい言語を嫌うもう 1 つの理由)。無知で申し訳ありません。助けてくださった方に感謝します。さよなら!

4

1 に答える 1

3

ここには 2 つの異なる問題があります。

  1. C も Objective-C も、ラベルの直後に変数を宣言することはできません ( switch ステートメント内の変数の宣言またはこの回答: https://stackoverflow.com/a/1115323/1187415を参照)。そう

    switch (k) {
        case 10:
            break;
        default:
            int x = 20; // ERROR: Expected expression
            break;
    }
    

    どちらの言語でも構文エラーです。ラベルの後にセミコロンを追加すると機能します。

        default: ;
            int x = 20; 
            break;
    

    これは C と Objective-C の両方で機能します。したがって、括弧を使用せずに switch ステートメント内で変数を宣言でき{ ... }ます。

  2. 自動参照カウントでは、これはObjective-C オブジェクトでは機能しなくなりました ( 「プロジェクトを変換して ARC を使用する場合」と比較してください。

    switch (k) {
        case 10: ;
            NSMutableArray *a = [NSMutableArray array];
            // ...
            break;
        default: // ERROR: Switch case is in protected mode
            break;
    }
    

    その理由は、ARC コンパイラがオブジェクトの有効期間を制御するために明確に定義されたスコープを必要とするためです。そして、唯一の解決策は、追加のスコープを導入すること{ ... }です:

    switch (k) {
        case 10: {
                NSMutableArray *a = [NSMutableArray array];
                // ...
            }
            break;
        default: // Switch case is in protected mode
            break;
    }
    

したがって、これは Objective-C の問題というよりも ARC の問題です。

于 2013-08-11T16:01:35.107 に答える