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 case 来打破循环?如果不是,那么具有相同效果的最佳实践是什么?

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

您还可以使用标志:

为了(...)
{
    布尔停止= 否;
    转变(...)
    {
        案例x:
            休息 ;
        案例y:
            停止=是;
            休息 ;
    }
    如果 ( 停止 ) { 休息 ; }
    别的东西();
}
于 2015-06-26T18:31:39.713 回答
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 回答