再見了switch...case
一、告別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頁:
我們只需要結合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~
相關文章
- 再見了,我的散裝研發管理平臺;再見了,4臺ECS!
- 再見了iPod經典款
- Andromeda OS 來了,Android 再見?Android
- 再見了Antirez永遠的Redis之神Redis
- 是時候向Chrome說再見了Chrome
- Fastjson到了說再見的時候了ASTJSON
- .NET MAUI 正式釋出,再見了 Xamarin.FormsUIORM
- 是時候優雅的和NullPointException說再見了NullException
- 再見了Kafka,MQ新王Pulsar大廠實踐!KafkaMQ
- 再見,Eclipse。Eclipse
- 再見,CommonsChunkPluginPlugin
- 再見,圖靈圖靈
- 再見,晚晚
- 效能優化常見謬論——面試別再這樣答了優化面試
- 再見了小屏iPhone!蘋果iPhone如今追求史上最大螢幕iPhone蘋果
- Android大變天,是時候和ButterKnife說再見了!Android
- 再見,Eclipse...Eclipse
- PNaCl 再見,WebAssembly 你好!Web
- RecycleView:再見前任(Listview)View
- Goodbye, Money 再見,美元Go
- 再見收費的Navicat,操作所有資料庫就靠它了資料庫
- 再見收費的Navicat!操作所有資料庫就靠它了!資料庫
- 再見收費的Navicat!操作所有資料庫靠它就夠了!資料庫
- 再見!百度防毒......防毒
- 再見,BLE的那些坑!
- Eclipse,到了說再見的時候了——Android Studio最全解析EclipseAndroid
- 現在是時候了與Spring Boot 1.x說再見了! - spring.ioSpring Boot
- 再見!今日起世間再無“Uber優步”AppAPP
- Spring Cloud 2020.0.0正式釋出,再見了NetflixSpringCloud
- 再見了"越獄" 感謝你讓iOS變得越來越好iOS
- 再見JQuery,我的老朋友jQuery
- 再見!onActivityResult!你好,Activity Results API!API
- 再見,視覺化!你好,Pandas!視覺化
- 演算法金 | 再見!!!KNN演算法KNN
- 再(也不)見——隨處可見的BAD UI!UI
- 不要再選擇MySQL了MySql
- switch...case && if...else效率比較和優化優化
- 再見,Python!你好,Go語言PythonGo