如何在Objective-C中的switch语句中使用goto?

时间:2009-11-19 15:59:16

标签: iphone objective-c switch-statement goto

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

我的代码是这样的:(有很多代码我把它全部留下来了)

switch (viewNumber) {
case 500:
        // [...]
break;

case 501:
        // [...]
break;
.
.
.
.
.

case 510:
        // [...]
break;

default:
break;

}

感谢您的时间! -Jeff

4 个答案:

答案 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)

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

正如其他人所说,这是非常糟糕的风格,并且使代码难以理解......

备选方案:

  1. 将公共代码视为一个单独的函数,并在2个位置调用它。
  2. 使用穿透,在案例中取消休息并且它会落到下一个案例中(请记住,案例不必按数字顺序排列!)
  3. 如果您只想在其他情况下完成部分案例,请使用if:
  4. 进行保护

    ,如

    case 500:
     .
     .
     .
    case 501:
        if(viewNumber == 501)    {
         .
         .
         .
        }
         .
         .
         .
        break;