在我的代码中,我需要能够在同一个 switch 语句中跳转(转到)不同的情况。有没有办法做到这一点?
我的代码是这样的:(有很多代码我都忽略了)
switch (viewNumber) {
case 500:
// [...]
break;
case 501:
// [...]
break;
.
.
.
.
.
case 510:
// [...]
break;
default:
break;
}
感谢您的时间!-杰夫
在我的代码中,我需要能够在同一个 switch 语句中跳转(转到)不同的情况。有没有办法做到这一点?
我的代码是这样的:(有很多代码我都忽略了)
switch (viewNumber) {
case 500:
// [...]
break;
case 501:
// [...]
break;
.
.
.
.
.
case 510:
// [...]
break;
default:
break;
}
感谢您的时间!-杰夫
像你要求的那样无条件地跳跃通常是非常糟糕的做法。
我认为一个更具可读性/可维护性的解决方案是将共享代码放在一个方法中,并让多个案例调用该方法。
如果你真的想,你可以使用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。
而不是 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
标签。
如果您的开关逻辑发生变化,您手上的情况就会很混乱。
如果将通用代码提取到自己的方法中,则代码更易于阅读、调试和扩展。
你可能应该尝试重写你的代码,比如递归调用,或者只是分解常见的东西并调用一个单独的函数。但是作为对您问题的修复和快速回答,您可以在切换之前放置一个标签并转到它,就像这样
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,您可以转到另一个案例,正如已经指出的那样。你也可以做一些类似于达夫的设备的花哨的东西,把箱子放在其他块里。但这只是疯了.. :)
[我正在制作这个答案社区维基,因为这实际上并没有回答问题本身]
正如其他人所说,这是非常糟糕的风格,并且导致无法阅读的代码......
备择方案:
如在
case 500:
.
.
.
case 501:
if(viewNumber == 501) {
.
.
.
}
.
.
.
break;