6

在我的代码中,我需要能够在同一个 switch 语句中跳转(转到)不同的情况。有没有办法做到这一点?

我的代码是这样的:(有很多代码我都忽略了)

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

而不是 using goto,重构您的代码,以便使用公共代码的两个(或多个)案例改为在一个公共方法中调用它。

就像是:

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-case树中搜索才能找到该goto标签。

如果您的开关逻辑发生变化,您手上的情况就会很混乱。

如果将通用代码提取到自己的方法中,则代码更易于阅读、调试和扩展。

于 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

[我正在制作这个答案社区维基,因为这实际上并没有回答问题本身]

正如其他人所说,这是非常糟糕的风格,并且导致无法阅读的代码......

备择方案:

  1. 将通用代码分解为一个单独的函数,并在 2 个地方调用它。
  2. 使用fallthroughs,在一个案例上留下中断,然后它会下降到下一个(记住,案例不必按数字顺序!)
  3. 如果您只想在另一种情况下完成部分情况,请使用 if 保护它:

如在

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