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