2012-07-12 168 views
2

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

+1

一个重要的注意事项 - 您不能在switch语句中使用NSString值,就像您可以在PHP等其他语言中一样。 http://stackoverflow.com/questions/4224495/using-an-nsstring-in-a-switch-statement 在Obj-c中,我认为开关语句在检查预定义数字常量时有意义 – 2012-07-12 16:06:26

回答

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; 

    }  
} 

这是一个commonn图案我使用,以避免魔术字符串或时髦条件逻辑的一个例子。由于枚举返回一个int结果,我经常使用它们作为路由和决策点。在这里,我创造了我的不同数据源的枚举:

typedef enum 
{ 
    HoursPickerComponent = 0, 

    MinutesPickerComponent = 1, 

    DaysPickerComponent = 2 

} MedicationPickerComponents; 

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

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

我觉得这是一个如何使用决策点开关一个很好的例子使代码更具可读性。请注意,我没有在案例陈述中放置很多逻辑......这样,您可以通过查看它轻松地说出此交换语句的用意。如果我有更复杂的代码运行,我只需将其存储在方法中,然后从我的case语句中调用方法。

+0

这很好,谢谢您。 – Morkrom 2013-07-21 17:19:52

4

如果控制流程取决于具有多于1个或2个值的变量的值,则开关更有意义,并且将更易于读取和维护。我没有在这里引用的消息来源,但我相信他们会编译到相同的本机代码,所以它不是一个性能或效率的问题。我认为你应该为可读性编码,并且当你有更多的条件时,一个开关比多个ifs更可取。