先來看一張圖片
項目中我們總是不可避免的要是用到if...else..
語句,或者大量使用swift...case...
語句,對於少量的判斷,也無可厚非了,但是對於大量的判斷,就會讓我們的代碼看上去特別亂,有些浪費代碼了。
OC 包括其他語言都給我們提供瞭解決這種困境的方法。這裏我說一下OC的使用。在這之前希望讀者對 Selector 有一定的瞭解。
①、假如代碼使用了大量的判斷,我們要儘量保證,每個判斷中的執行代碼都可以抽出去放在一個方法中執行。 也就是說如果還要使用if…else或switch…case… ,那麼保證每個判斷中只執行一句代碼(調用一個方法),看上去代碼也是整潔的。
②、這裏我引入了容器的概念,在OC中 array、dictionary、set 都可以作爲容易使用,讀者可根據自己的愛好選擇容器。在我的項目裏,我使用array作爲容易,存儲了所有判斷中可執行到的方法,如下圖: 在這個容器中存儲的字符串,每個字符串都是一個方法名。每個方法都是即將在if判斷下要執行的方法。
③、使用Selector 、NSSelectorFromString
該方法可將字符串名轉化爲SEL,用於供對象執行,前提是該方法是存在的。
因此大量的if…else… 就簡化成了如下兩句代碼
- (void)initBanner:(BannerType)type{
SEL selec = NSSelectorFromString(self.selectArr[type]);
[self performSelector:selec];
}
這兩句代碼即可代替七個 if判斷 來執行正確的方法了,這樣就做到了大量簡化代碼。注意 BannerType
是定義好的從0開始的枚舉值,所以用array做容器了。
④、優化,如上所述的代碼,存在一個可能leak(泄漏) 的問題,xcode已經給出了警告。如下圖:
這個警告標示 這樣寫代碼可能存在內存泄漏的問題,因此,我們做出如下優化。
- (void)initBanner:(BannerType)type{
if (!self) {
return;
}
SEL selec = NSSelectorFromString(self.selectArr[type]);
IMP imp = [self methodForSelector:selec];
void(*func)(id,SEL) = (void *)imp;
func(self,selec);
}
這樣就沒有這個警告了。
總結:解決 大量判斷 的關鍵在於 NSSelectorFromString 方法。希望能幫助到有困惑的朋友們
我是磊懷 2849765859 QQ 歡迎指教