切换语句VS If语句

时间:2012-07-12 15:54:17

标签: ios if-statement switch-statement

我的项目中有很多if语句,嵌套if语句和if-else语句,我正在考虑将它们更改为switch语句。其中一些将具有嵌套的switch语句。我知道在编译方面,switch语句通常更快。我的问题是,通常更倾向于使用?

2 个答案:

答案 0 :(得分:7)

这是一个重要的区别

switch语句采用带有整数结果的表达式,并将其与常量值的case语句匹配。 case语句不能是表达式...所以当你需要从一组确定的值中计算整数结果时,switch语句才有意义。

IMO,嵌套的switch语句可能会给你的代码增加混乱......它不仅仅是可读的。

以下是我使用switch语句返回UIPickerView组件的相应数据源的示例

- (NSMutableArray *) datasourceForComponent:(NSInteger)component
{
    switch (component) {

        case HoursPickerComponent: 
            return _hours;
            break;

        case MinutesPickerComponent:            
            return _mins;
            break;

        case DaysPickerComponent:            
            return _days;
            break;

        default:
            return nil;
            break;

   }    
}

这是我用来避免魔术字符串或时髦条件逻辑的常见模式。由于枚举返回int结果,我经常将它们用于路由和决策点。在这里,我为不同的数据源创建了一个枚举:

typedef enum
{
    HoursPickerComponent = 0,

    MinutesPickerComponent = 1,

    DaysPickerComponent = 2

} MedicationPickerComponents;

然后我的UIPickerView组件的委托代码看起来像

- (NSInteger)pickerView:(UIPickerView *)pickerView 
numberOfRowsInComponent:(NSInteger)component
{
    return [[self datasourceForComponent:component] count];
}

我觉得这是一个很好的例子,说明如何使用开关作为决策点来使代码更具可读性。请注意,我没有在case语句中添加很多逻辑...这样你就可以通过查看它来轻松地告诉这个switch语句的意图。如果我有更复杂的代码要运行,我会在方法中将其存根并从我的case语句中调用该方法。

答案 1 :(得分:4)

如果控制流取决于具有多于1或2个值的变量的值,则开关更有意义并且更易于阅读和维护。我没有在这里引用的来源,但我相信他们无论如何都会编译成相同的本机代码,因此它不是性能或效率的问题。我认为您应该编写可读性代码,并且由于您有更多条件,因此交换机优于多个ifs。