2012-07-12 173 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更可取。