6

私のコードでは、同じswitchステートメント内で別のケースにジャンプ(goto)できる必要があります。これを行う方法はありますか?

私のコードは次のようなものです:(私がすべてを省略したコードがたくさんあります)

switch (viewNumber) {
case 500:
        // [...]
break;

case 501:
        // [...]
break;
.
.
.
.
.

case 510:
        // [...]
break;

default:
break;

}

お時間をいただきありがとうございます!-ジェフ

4

4 に答える 4

17

あなたが求めているように無条件にジャンプすることは、一般的に非常に悪い習慣です。

より読みやすく保守しやすい解決策は、共有コードをメソッドに配置し、複数のケースでメソッドを呼び出すことだと思います。

本当にしたい場合は、次gotoのようなことを行うために使用できます。

switch(viewNumber) {
    case 500:
        // [...]
        goto jumpLabel;
    case 501:
        // [...]
        break;
    case 502:
        // [...]
        jumpLabel:
        // Code that 500 also will execute
        break;
    default:break;
}

注: 上記のコード例は、質問に答えるために提供しただけです。私は今とても汚れているので、Bad Code Offsetsを購入しなければならないかもしれません。

于 2009-11-19T16:07:05.267 に答える
4

を使用する代わりにgoto、コードをリファクタリングして、共通のコードを使用する 2 つ (またはそれ以上) のケースが代わりに共通のメソッドでそれを呼び出すようにします。

何かのようなもの:

switch (value) {
   case (firstValue):
       // ...
       break;
   case (secondValue):
       [self doSharedCodeForSecondAndThirdValues];
       break;
   case (thirdValue):
       [self doSharedCodeForSecondAndThirdValues];
       break;
   default:
       break;
}

// ...

- (void) doSharedCodeForSecondAndThirdValues {
   // do stuff here that is common to second and third value cases
}

goto悪い習慣ではありますが、を使用することは世界の終わりではありません。

の使用を避ける実際的な理由は、そのラベルを見つけるためにツリーをgoto検索する必要があるためです。swtich-casegoto

スイッチのロジックが変更されると、厄介な状況が発生します。

共通コードを独自のメソッドに引き出すと、コードが読みやすくなり、デバッグや拡張が容易になります。

于 2009-11-19T16:29:23.067 に答える
0

おそらく、再帰呼び出しのようにコードを書き直すか、一般的なものを取り出して別の関数を呼び出す必要があります。しかし、質問に対する修正と迅速な回答として、スイッチの前にラベルを付けて、次のように移動できます

switchLabel:
switch(viewNumber) {
  case 500: {
    viewNumber = 501;
    goto switchLabel;
  }
}

ここではObjective-Cの構文はわかりませんが、そのバリエーションを試すこともできます

int lastView = 0;

while (lastView != viewNumber)
  switch(lastView = viewNumber) {
    case 500: {
      viewNumber = 501;
      break;
    }
  }

これは、viewNumber が変更されなくなるまでループし続けます。ただし、これはまだ見栄えの良い goto にすぎません。

goto を実行しているので、すでに指摘したように、別のケースに移動できます。ケースを他のブロックの中に入れることで、ダフのデバイスに似た凝ったものを作ることもできます。しかし、それはただ怒っています.. :)

于 2009-11-19T16:08:34.343 に答える
-1

[これは実際には質問自体に回答していないため、この回答コミュニティ wiki を作成しています]

他の人が言ったように、これは非常に悪いスタイルであり、読めないコードになります...

代替案:

  1. 共通コードを別の関数に分解し、それを 2 か所で呼び出します。
  2. フォールスルーを使用し、ケースのブレークをオフのままにしておくと、次のケースにフォールスルーします (ケースは番号順に並んでいる必要はありません!)
  3. ケースの一部だけを別のケースで実行したい場合は、if で保護します。

のように

case 500:
 .
 .
 .
case 501:
    if(viewNumber == 501)    {
     .
     .
     .
    }
     .
     .
     .
    break;
于 2009-11-19T16:30:19.103 に答える