【问题标题】:Should I use an if or switch Statement? Objective-C我应该使用 if 或 switch 语句吗? Objective-C
【发布时间】:2012-01-12 04:20:54
【问题描述】:

我一直想知道但找不到明确的答案。我什么时候应该使用“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 
    }
}

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

【问题讨论】:

    标签: iphone objective-c if-statement switch-statement


    【解决方案1】:

    Switch 语句比嵌套的 if 语句更快。而已。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        Switch 就像if elseif。太多的Switchif elseif 会使你的代码很难阅读和理解。但没有任何功能问题。

        【讨论】:

          【解决方案4】:

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

          • ...现在,如果有一个 fobnicated quibplatz,我们应该做...(否则...应该做)if 的映射)
          • ...现在根据 quibplatz 的值,我们应该...如果是 0,...如果是 1(,...如果它们都不是)映射switch
          • ...我们使用 ... 或 ... 基于事实是否 ... 成立 映射为 ?:

          因此,请使用与您对人类实际决策的看法相匹配的方法。

          当然,应该强调的许多场景中正确的OO解决方案......我们这样做......我们这样做是为了......,这样对于 ... 而这种方式对于 ...,经常使用switch(但它也适用于某些ifs)是不使用这些构造并用多态替换它们。人工决策只应在有真正决策时进行,而不是伪造(逻辑)多态性。

          【讨论】:

          • 例如,第一步是否使用switch,第二步是使其成为多态调用(因为这是我在答案中写的伪造的多态)。
          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            在这种情况下,这无关紧要。 switch 存在的原因是它比 if 更快。如果你写了很长的if ... else if ... else if ... 代码,它的执行速度会比switch 慢,因为if 进行迭代搜索(O(n)),而switch 进行基于表的查找(O(1))

            【讨论】:

              【解决方案7】:

              这取决于你想在里面做什么。 请记住,您不能在 switch 语句中分配新对象

              【讨论】:

              • 你不能在 switch 中声明局部变量,除非你用 { 和 } 创建一个新的作用域块
              • @progrmr 这就是重点。您可以在开关内分配新对象
              【解决方案8】:

              我认为这是一个主观问题。答案完全取决于您。

              对于我自己的代码,我喜欢使用switch 语句,因为很明显正在发生的事情是某些条件的结果,如果条件不同,则可以执行其他操作。

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

              【讨论】:

              • 还要注意switch理论上可能更快。但是,如果您只有几个案例,那并没有太大的区别。
              • 正如@Dani 在他的回答中提到的,switch 需要 O(1) 时间来执行,而 if ... else if ... else if ... 将是 O(n),其中 n 是条件数。造成这种情况的原因之一是,使用 if ... else 构造时,必须在每次命中条件时评估条件,而 switch case 是表查找。
              • 查看 Dani 的评论。它基于算法复杂度。
              猜你喜欢
              • 2020-11-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-01-08
              • 1970-01-01
              • 1970-01-01
              • 2022-12-11
              • 2010-11-10
              相关资源
              最近更新 更多