2009-11-19 33 views
6

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

我的代码是这样的:(有很多的代码,我刚刚离开了这一切)

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

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

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

default: 
break; 

}

谢谢您的时间! -Jeff

+9

不要,那将是非常糟糕的编码习惯:在其他情况下完成的,与是否保护它。 – zaph 2009-11-19 16:06:46

+0

您是否在寻找一个值是否匹配或者其他值,它们都运行相同的代码大小?如果是这样,你可以通过正确的案例。 。 – 2009-11-19 16:08:06

+0

摆脱所有多余的括号,请:( – KevinDTimm 2009-11-19 16:22:35

回答

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

+0

谢谢switch语句是一个方法: - (IBAction为)showViewAction:(ID)发送 { \t viewNumber = [发送方标签]; 但案件#我现在用的就是发送方的标签ID。因此,当用户点击与标签ID 500的按钮的方法使用该标签知道使用什么情况。 – Jeff 2009-11-19 16:14:35

+1

所以这个方法必须是巨大的!从'情况下删除代码'语句并把它们在其他方法可能会使事情更容易阅读。另外,如果你有按钮的静态数量,你可以直接在每个按钮以它自己的方法使用目标的行动联系起来。 – 2009-11-19 16:18:03

+0

我曾经有过它的方式针对每个案例和IB所有案例的单独方法ns连接到“IBAction”,但我的老板认为如果我使用Switch语句而不是单独的方法,代码将“更可靠,更优雅,运行更快”。所以你说,再次使用单独的方法会更好?我之前也听说过“goto”不好用...你知道它为什么不好吗? – Jeff 2009-11-19 16:28:19

0

你可能应该尝试重写你的代码,就像递归调用或者只是将常见的东西分解并调用一个单独的函数。但作为一个修复和快速的回​​答你的问题,你可以把一个标签交换机之前和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不再改变。尽管如此,这仍然非常漂亮。正如已经指出的那样,由于我们正在做gotos,你可以转到另一个案例。你也可以做一些类似于达夫设备的花哨的东西,把盒子放在其他的块里面。但这只是疯了.. :)

+0

非常感谢! – Jeff 2009-11-19 16:29:13

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标签。

如果你的开关逻辑改变了,你的手上就会出现一个混乱的情况。

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

-1

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

正如其他人所说,这是非常糟糕的风格,并为不可读代码...

备选方案:

  1. 因子的共同代码到一个单独的函数,并调用在2个地方。
  2. 使用fallthroughs,离开案件的休息,并通过下一个(请记住,案件不必以数字​​顺序!)
  3. 如果您只希望部分案件是

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

很高兴知道谢谢 – Jeff 2009-11-19 16:35:45