这段代码使用switch-case,如果还有if else哪个更好?

时间:2016-02-23 08:16:53

标签: ios objective-c

代码

if ([@[@1,@2,@3] containsObject:@(section)]) {
    return 10;
}else if ([@[@0,@4] containsObject:@(section)]) {
    return 15;
}else {
    return 0;
}

&安培;&安培;

switch (section) {
    case 0:
        return 15;
    case 1:
        return 10;
    case 2:
        return 10;
    case 3:
        return 10;
    case 4:
        return 15;
    default:
        break;
}
return 0;

我想知道哪种方式更好(代码行,运行效率......)

我喜欢swift的转换案例......

6 个答案:

答案 0 :(得分:6)

Switch case总是更好,效率最高,因为所有条件都是在编译时静态分配的,并且不需要运行时计算。

为了使代码清晰,您也可以

switch (section) {
    case 0:
    case 4:
        return 15;
    case 1:
    case 2:
    case 3:
        return 10;
    default:
    return 0;
        break;
}

答案 1 :(得分:1)

我倾向于在可以的时候使用开关。速度优化可以是真实的,但对于小型测试我真的不重要。在我看来,真正的优势在于切换必须是详尽无遗的:您必须使用default: catch来处理所有可能的值。

此外,使用Swift可以大大提高切换可读性,因为您不必添加break语句以避免在下一种情况下崩溃,并且您可以将条件分组到同一行:

switch (section) {
case 0, 4:
    return 15
case 1...3:
    return 10
default:
    return 0
}

答案 2 :(得分:1)

切换更好,并使用@MichaëlAzevedo提到的用例范围

当编译器命中switch语句时,它会创建一个包含所有可能条件的查找表。在if-else类型的验证中,编译器必须在每次进入if时评估条件,否则if,else ..

答案 3 :(得分:0)

使用开关/外壳。更清楚的是你在做什么,这使代码更具可读性。此外,您总是会捕获默认情况,从而产生确定性算法。

答案 4 :(得分:0)

switch case更好,因为它的可读性,并且你在编译时创建了一种查找表,在switch case中。所以不需要计算和计算。

答案 5 :(得分:0)

似乎编译器在优化switch语句方面优于if语句。

编译器不知道评估if语句的顺序对您是否重要,并且不能在那里执行任何优化。您可以在if语句中调用方法,从而影响变量。使用switch语句,它知道所有子句可以同时进行评估,并且可以按照最有效的顺序放置它们。