0

次のようなループがあります。

label: for(X *y in z)
    {
        switch(y.num)
        {
          case ShouldDoSomething:
            [self somethingWithX:y];
            break;
          case ShouldStopNow:
            y = [self valWhenStopped];
            break label;
        }
        [val append y];
    }

もちろん、Objective-C はループのラベル付けをサポートしていないため (少なくとも、試してみると、コンパイル エラーがスローされますExpected ';' after break statement)、これは機能しません。Objective-C で switch ケースを使用してループを中断する方法はありますか? そうでない場合、同じ効果を持つベスト プラクティスは何ですか?

4

3 に答える 3

4

解決策は、式全体をメソッドに入れ、return で switch ステートメントを終了することです。

- (void)checkSomething:(id)object
{
  for(X *y in object)
  {
    switch(y.num)
    {
      case ShouldDoSomething:
        something();
        break;
      case ShouldStopNow:
        return;
        break;
    }
    somethingElse();
  }
}

別の解決策は、ブール値フラグを使用することです

for(X *y in Z)
  {
    BOOL willExitLoop = false;
    switch(y.num)
    {
      case ShouldDoSomething:
        something();
        break;
      case ShouldStopNow:
        willExitLoop = true;
        break;
    }
    if (willExitLoop) break;
    somethingElse();
  }
于 2015-06-26T18:23:42.777 に答える
1

私はあなたが探していると思いますcontinue

for(X *y in Z)
{
switch(y.num)
{
    case ShouldDoSomething:
        something();
        break;
    case ShouldStopNow:
        continue;  //-- this will break the switch and reenter the for loop with the next element
}
somethingElse();
}
于 2015-06-26T20:37:02.470 に答える
1

フラグを使用することもできます。

為に(...)
{
    BOOLストップ=いいえ;
    スイッチ(...)
    {
        ケース× :
            壊す ;
        ケースy :
            ストップ=はい;
            壊す ;
    }
    if ( ストップ ) { ブレーク ; }
    何か他の();
}
于 2015-06-26T18:31:39.713 に答える