我应该使用if还是switch语句?Objective-C

5

我一直有疑问,但找不到一个确定的答案。在什么情况下我应该使用'if'或'switch'语句?有什么区别?

例如,我可以这样做:

-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
    switch (buttonIndex) {
        case 0:
            //Stuff
            break;

        case 1:
            //Stuff
            break;

        default:
            break;
    }

//OR

    if (buttonIndex == 0) {
        //Stuff
    }
    if (buttonIndex == 1) {
        //Stuff 
    }
}

这只是一个例子,但我相信在不同的情况下,它会有不同的影响。

8个回答

13
在这种情况下并不重要。开关存在的原因是它比 if 快。 如果你编写了一个长的代码,使用 if... else if... else if...,那么它的执行速度将比 switch 慢,因为 if 是迭代搜索(O(n)),而 switch 是基于表格查找(O(1))。

7
我认为这是一个主观的问题。答案真的取决于你自己。
对于我的代码,我喜欢使用switch语句,因为很清楚正在发生的事情是某些条件的结果,如果条件不同,则可以进行其他操作。
但是,如果switch case:语句下面的代码相当冗长或复杂,那么对于我自己的代码,我会做第二件事:使用if (buttonIndex == 0) {

还应该注意到,switch 理论上可能更快。但如果只有几个情况,这并没有太大的区别。 - mrueg
3
正如 @Dani 在他的回答中提到的,switch 执行所需的时间为O(1),而if ... else if ... else if ... 的执行时间将是O(n),其中n是条件的数量。 其中一个原因是,在 if ... else 结构中,每次命中都必须评估条件,而 switchcase 则是表查找。 - Beltalowda
请查看Dani的评论。它基于算法复杂度。 - Lal Krishna

4

如果您只是检查一个变量是否具有特定的值(buttonIndex == 1),并且对多个值进行此操作,则最好使用switch

但是,如果您使用了一些更复杂的条件(甚至包括函数在内的条件),那么应该使用if语句


3
我希望你能尽可能地让代码接近于人类的理解。这就是为什么三种不同的思维过程(if-then-else、switch-case-default 和 ?:)适合于映射三种不同类型的决策的原因:
- “......现在,如果有一个 frobnicated quibplatz 的事件发生,我们应该......(否则......应该被执行)” 是 if 的一种映射方式。 - “......现在基于 quibplatz 值,如果它是 0,我们应该做......,如果它是 1,我们应该做......(如果不是这两种情况,则......应该被执行)” 是 switch 的一种映射方式。 - “......我们使用......或......基于......是否成立” 是 ?: 的一种映射方式。
所以,请根据你作为一个人实际进行决策的方式来选择相应的方法。
当然,需要强调的是,在许多场景中,正确的面向对象(OO)解决方案是“......我们这样做......是为了......,那样做......是为了......,这样做......是为了......” 这种情况通常使用 switch(但某些 if 也适用),而不是使用这些结构并用 polymophism 替换它们。只有在存在真正的决策时,才应该进行手动决策,而不是伪造(逻辑)多态性。

对于您的示例,第一步是使用switch语句,第二步是将其转换为多态调用(因为这是我在答案中编写的伪多态)。 - user1046334

1

Switch语句比嵌套的if语句更快。就是这样。


0

Switch 就像 if elseif。过多的 Switchif elseif 会使您的代码非常难以阅读和理解。但没有任何功能问题。


-1

这取决于你想在其中执行什么操作。 请记住,您不能在switch语句内分配新对象。


除非你使用 { 和 } 创建新的作用域块,否则不能在 switch 语句内声明局部变量。 - progrmr
@progrmr 这就是重点。你_可以_在 switch 内部分配新对象。 - Angelo

-3
如果“if”和“switch”如此邪恶,它们应该已经从现代编程语言中删除了。事实是它们仍然存在。我认为关键是我们应该尽力使我们的代码正确高效、易于理解和维护。面向对象编程只是编写程序的一种方式,我们不应该为了纯粹的面向对象编程而编写程序。所以这真的是一个主观问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接