Iphone 我应该使用if或switch语句吗?目标-C

Iphone 我应该使用if或switch语句吗?目标-C,iphone,objective-c,if-statement,switch-statement,Iphone,Objective C,If Statement,Switch Statement,我一直在想,但找不到确切的答案。何时应该使用“if”或“switch”语句。什么时候一个比另一个好 例如,我可以做: -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{ switch (buttonIndex) { case 0: //Stuff break; case 1:

我一直在想,但找不到确切的答案。何时应该使用“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 
    }
}

这只是一个例子,但我相信在不同的情况下,它的重要性会有所不同。

我认为这是一个主观问题。答案真的取决于你

对于我自己的代码,我喜欢使用
switch
语句,因为很明显,发生的事情是某些条件的结果,如果条件不同,这些条件可以做其他事情


但是,如果
开关下面的代码
case:
语句相当长或复杂,那么对于我自己的代码,我会做第二件事:if(buttonIndex==0){
位。

如果只检查一个变量是否具有特定值(buttonIndex==1)对多个值执行此操作时,最好使用
开关


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

这取决于您希望在其中执行什么操作。
请记住,您不能像
if elseif
那样在switch语句中分配新对象。过多的
switch
if elseif
将使您的代码很难阅读和理解。但没有任何函数问题。

在这种情况下,这无关紧要。存在切换的原因是它的速度更快如果您编写了一个长代码
if…else if…else if…
它的执行速度将比switch慢,因为
if
执行迭代搜索(O(n)),而
switch
执行基于表的查找(O(1))

如果“If”和“switch”如此邪恶,它们应该从现代编程语言中删除。事实是它们仍然存在。我认为关键是我们应该尽最大努力使代码正确有效地工作,易于理解和维护。OOP只是编写程序的一种方式,我们不应该为纯OOP编写程序。所以我这确实是一个主观问题。

我希望代码尽可能接近人类的理解。这就是为什么三种形式的决策(if-then-else、switch-case-default、:)适合映射三种不同的过程:

  • …现在,在一个事件中有一个蛙鸣的quibplatz,我们应该做…(否则…应该做)是
    的映射,如果
  • …现在基于quibplatz值,我们应该做…如果它是0,…如果它是1(,…如果它不是其中任何一个),如果
    开关的映射
  • …我们使用…或…是基于这样一个事实:如果…保持或不保持,则映射为
    ?:
因此,使用一个映射到你认为作为一个人的实际决定的方式


当然,应该强调的是,在很多场景中,适当的OO解决方案是……我们这样做是为了……我们这样做是为了……我们这样做是为了……我们这样做是为了……我们这样做是为了……我们这样做是为了……我们这样做是为了……我们这样做是为了就是不要使用这些结构,而是用多相性代替它们。手动决策应该只在有真实决策时进行,而不是伪造(逻辑)多态性。

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

还应该注意的是,
Switch
理论上可能更快。如果只有少数情况,则没有多大区别。正如@Dani在回答中提到的,
Switch
需要O(1)
if…else if…else if…
将为O(n)时执行的时间其中n是条件数。其中一个原因是使用
if…else
构造时,每次点击条件时都必须对其进行评估,而
开关
case
是一个表格查找。请查看Dani的注释。这是基于算法复杂性的。对于您的示例,如果要使用
switch
,第二步是使其成为多态调用(因为这是我在回答中编写的一个伪造多态性)。除非使用{and}@progrmr创建一个新的作用域块,否则不能在交换机内声明局部变量。这就是重点。您可以在交换机内分配新对象