【问题标题】:Switch statement VS If statementSwitch 语句 VS If 语句
【发布时间】:2012-07-12 15:54:16
【问题描述】:

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

【问题讨论】:

  • 一个重要的注意事项 - 您不能像在 PHP 等其他语言中那样在 switch 语句中使用 NSString 值。 stackoverflow.com/questions/4224495/… 在 Obj-c 中,我认为 switch 语句在检查预定义的数字常量时是有意义的

标签: ios if-statement switch-statement


【解决方案1】:

这是一个重要的区别

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 语句中调用该方法。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      相关资源
      最近更新 更多