再見了switch...case

Jason(楊)發表於2017-06-27

一、告別switch...case

  分支語句在程式裡有著重要的地位,通常都是用if…else或者switch…case語句來實現。比如網路請求中狀態碼與描述的對應關係,可以寫成:

switch (code) {  
  case 200:  
    description = @"Success";  
    break;  
  case 400:  
    description = @"Bad Request";  
    break;  
  case 404:  
    description = @"Not Found";  
    break;  
  default:  
    description = @"Success";  
    break;  

}

  如果code是字串,在OC中甚至需要寫成if...else的形式:

if ([code isEqualToString:@"200"]) {  
  description = @"Success";  
} else if([code isEqualToString:@"400"]){  
  description = @"Bad Request";  
} else if ([code isEqualToString:@"404"]){  
  description = @"Not Found";  

}

  如果分支很多的話,程式碼就會變得很臃腫,不優雅(實現相同功能的程式碼有無數種寫法,但一個優秀的程式設計師要找到最優雅的那種)。這時候就輪到本文的主角——陣列登場啦~
  我們為狀態碼和描述建立兩個相對應的陣列,這樣一來,就可以通過下標進行匹配,程式碼如下:

NSArray *codeArray = @[@"200", @"400", @"404"];  
NSArray *descArray = @[@"Success", @"Bad Request", @"Not Found"];  
NSString *description = @"Success";  
//假設獲取到的code為404  
NSString *code = @"404";   
NSUInteger index = [codeArray indexOfObject:code];  
if (index != NSNotFound && index < descArray.count) {  
  description = [descArray objectAtIndex:index];  

}
  這樣一來,哪怕後續再有新的狀態,我們也不需要去修改程式碼邏輯,只需要對兩個陣列做相應的增加即可。甚至還可以把兩個陣列的內容放到配置檔案(如plist)中去,讓不懂寫程式碼的人也可以按需求進行修改。

二、勾搭多型,擁抱陣列

  拋開分支,陣列還有很多種方式幫我們簡化程式碼,比如建立下圖這樣tab頁:
圖2-1
  我們只需要結合NSClassFromString與多型,就可以很輕鬆地用迴圈實現。不BIBI,直接上程式碼:

NSArray *classNameArray = @[@"HomeViewController",@"OrderViewController",@"MyViewController"];  
NSArray *imageNameArray = @[@"home",@"order",@"my"];  
NSArray *titleArray = @[@"主頁",@"訂單",@" 我的"];  
NSMutableArray *navArray = [NSMutableArray array];  
//迴圈設定UINavigationController的RootViewController,並加入陣列  
for (int i = 0; i < classNameArray.count; i++) {  
  UIViewController *viewController = [[NSClassFromString(classNameArray[i]) alloc] init];  
  viewController.title = titleArray[i];  
  UIImage *normalImage = [UIImage imageNamed:[NSString stringWithFormat:@"%@", imageNameArray[i]]];  
  UIImage *selectedImage = [UIImage imageNamed:[NSString stringWithFormat:@"%@_sel", imageNameArray[i]]];  
  viewController.tabBarItem.image = [normalImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];  
  viewController.tabBarItem.selectedImage = [selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];  
  UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];  
  [navArray addObject:navigationController];  
}  
//設定UINavigationController為UITabBarController的viewControllers  
UITabBarController *tabBarController = [[UITabBarController alloc] init];  
tabBarController.viewControllers = navArray;  

self.window.rootViewController = tabBarController;

  這段程式碼關鍵就在於 UIViewController *viewController = [[NSClassFromString(classNameArray[i]) alloc] init];我們使用NSClassFromString來獲取子類,並用子類建立物件賦值給父類UIViewController,從而讓程式碼變得更優雅。
  好了本篇就到這吧,若有不同觀點,歡迎留言PK~

相關文章