更好的閱讀體驗請點擊 原文
接上篇,其實在接觸Ruby不久后卸夕,我就萌生了改造ObjC的Cocoa框架的想法层释。為什么要改造?只為能夠提高開發(fā)OC項目的效率娇哆。同時我也完成了一些改造工作湃累,詳見像Ruby一樣寫ObjC勃救,用block實現(xiàn)鏈?zhǔn)椒椒ㄕ{(diào)用
說到改造這個問題,我想起曾經(jīng)有人說治力,合格的程序員都會不斷追求自動化蒙秒,不斷追求代碼的解耦與復(fù)用,不斷追求拓展技術(shù)的邊界宵统。我們也往往會從這三個方向找切入口晕讲,例如OC和Python一樣充斥了一些C語言函數(shù)形式的方法或者宏,例如NSLog()
马澈、NSLocalizedString()
瓢省,或是CoreGraphic框架中一系列的C函數(shù),更有甚者GCD(Grand Central Dispatch)完全是C函數(shù)代碼痊班,但GCD因為把多線程編程做的跟if/else一樣好用勤婚,所以用多了也都接受了。
舉個栗子
我們今天就從NSLocalizedString這個宏作為切入口涤伐,舉一個例子:
//慣用方法
NSString* str = NSLocalizedString(@"你好,世界",nil);
從OOP的角度思考馒胆,我們不難想到字符串的本地化轉(zhuǎn)換,完全可以作為NSString類的實例方法來設(shè)計凝果,而不是像NSLocalizedString宏這樣的設(shè)計祝迂,這個設(shè)計可以說堪比Python的len()方法。
重新設(shè)計的本地化接口
NSString* str = [@"你好器净,世界" localizedString];
這樣調(diào)用不僅更符合我們的思維邏輯型雳,也更符合OOP的理念,并且和NSString其他的接口也保持了一致性山害。使用ObjC的Category特性纠俭,就可以輕松實現(xiàn)
@interface NSString (add)
- (NSString*)localizedString;
@end
@implementation NSString(add)
- (NSString*)localizedString;{
return NSLocalizedString(self, nil);
}
@end
同樣的我們還可以給NSString或者其他類型增加各種各樣的類別(Category)進(jìn)行拓展,例如比較有名集大成框架YYKit粗恢,在NSString擴(kuò)展中加入各種摘要算法轉(zhuǎn)換方法柑晒,給實際開發(fā)帶來了極大的便利欧瘪。
第二個栗子
如果第一個栗子不能跟你產(chǎn)生多少共鳴眷射,那就請看接下來的栗子:給NSArray增加高階函數(shù)Map,類似的Filter佛掖,Reduce函數(shù)在Python妖碉、JavaScript、Swift芥被、Ruby中都是標(biāo)配了欧宜,而OC則顯得略有落后,但落后并不妨礙我們進(jìn)行改造拴魄,同樣給NSArray增加Category方法冗茸,實現(xiàn)依賴于OC對block的支持
@interface NSArray (Functional)
- (NSArray*)map:(id (^)(id x))map;
@end
@implementation NSArray (Functional)
- (NSArray*)map:(id (^)(id))map
{
NSMutableArray* array = [NSMutableArray array];
[self enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
id x = map(obj);
if(x) [array addObject:x];
}];
return [array copy];
}
@end
block的出現(xiàn)相當(dāng)于提高了代碼塊的身份席镀,雖然它還不是OC的一等公民,但已經(jīng)可以和實例對象平起平坐夏漱,作為參數(shù)進(jìn)行傳遞了豪诲。如果你是一個不太明白block機制的新手,我這里還有一篇教程推薦給你挂绰。如果了解block屎篱,上面的代碼就很好理解了,沒有任何優(yōu)化葵蒂,僅僅是封裝了拿東西
和包裝
這兩個步驟交播。
那,NSArray實現(xiàn)Map方法意味著什么呢践付?意味著我們加工一組數(shù)據(jù)時秦士,只要專心數(shù)據(jù)的加工工作就好。
NSArray* a = @[@"a",@"b",@"c"];
a = [a map:^id(id x) {
return [x uppercaseString];
}];
NSLog(@"%@",a);
(
A,
B,
C
)
究竟能否提高開發(fā)效率
這個問題其實不用討論也知道可以永高,因為我們都有過復(fù)制粘貼重復(fù)寫代碼的經(jīng)歷伍宦,而這種代碼封裝和復(fù)用,甚至比復(fù)制粘貼更簡單乏梁,每使用一次次洼,都能節(jié)省幾秒鐘甚至幾分鐘的時間,一并節(jié)省不少精力遇骑,長年累月則是受益無窮卖毁。