在我的代码中,我需要能够在同一个switch语句中跳转(转到)不同的情况。有没有办法做到这一点?
我的代码是这样的:(有很多代码我把它全部留下来了)
switch (viewNumber) {
case 500:
// [...]
break;
case 501:
// [...]
break;
.
.
.
.
.
case 510:
// [...]
break;
default:
break;
}
感谢您的时间! -Jeff
答案 0 :(得分: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。
答案 1 :(得分:4)
不是使用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
标签。
如果您的开关逻辑发生变化,您的手上就会出现凌乱的情况。
如果将公共代码拉出到自己的方法中,代码就更容易阅读,调试和扩展。
答案 2 :(得分: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。
由于我们正在做的事情,你可以直接转到另一个案例,正如已经指出的那样。你也可以通过把箱子放在其他街区内来做类似于Duff设备的花哨的东西。但那只是疯了.. :)
答案 3 :(得分:-1)
[我正在制作这个答案社区维基,因为这实际上并没有回答问题本身]
正如其他人所说,这是非常糟糕的风格,并且使代码难以理解......
备选方案:
,如
case 500:
.
.
.
case 501:
if(viewNumber == 501) {
.
.
.
}
.
.
.
break;