tags:ios
每一個iOS開發(fā)者都有很多糾結(jié)的事。即使對老手而言也是如此。每做一個新的 feature 都要糾結(jié)一下是用 obj-c 還是 swift 來寫。這種糾結(jié)隨著 swift 的成熟而與日俱增。
技術(shù)選型猶如采購電子產(chǎn)品,用新不用舊,新項目自然傾向于用 swift 。無奈手頭的應(yīng)用有很多基于 obj-c ,不可能完全重寫。而 obj-c 與 swift 混編雖然可行,卻不是我想走的方向。一來無端的給應(yīng)用增加了一些不必要的東西,二來頻繁在 obj-c 與 swift 之間來回切換給心靈帶來的沖擊實在太大,畢竟二者的范式不同。
如此看來,讓基于 obj-c 的開發(fā)更舒坦一點是很有意義的。swift 的若干語言特性中,對函數(shù)式編程編程的友好支持是讓人心動的。其實在 obj-c 中,也可以做到類似的效果。有一些第三方的庫,比如RXCollections,可以在這方面幫我們。然而我不太喜歡RXCollections中方法的命名。 自己簡單的整了一下,可以愉快的玩玩了。
頭文件聲明
#import <Foundation/Foundation.h>
@interface NSArray (FP)
- (NSArray *)filter:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate;
- (NSArray *) sort:( NSComparisonResult (^)(id obj1, id obj2)) block;
- (NSArray *)map:(id(^)(id))block;
- (id) reduce:(id (^)(id memo, id obj)) block withInitialMemo:(id) memo;
@end
實現(xiàn)文件
#import "NSArray+FP.h"
@implementation NSArray (FP)
- (NSArray *)filter:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate {
NSIndexSet * filteredIndexes = [self indexesOfObjectsPassingTest:predicate];
return [self objectsAtIndexes:filteredIndexes];
}
- (NSArray *)map:(id(^)(id))block {
NSMutableArray * newArray = [NSMutableArray array];
for (id item in self) {
id obj = block(item);
[newArray addObject:obj];
}
NSArray *arrReturn = [NSArray arrayWithArray:newArray];
[newArray removeAllObjects];
return arrReturn;
}
- (NSArray *) sort:( NSComparisonResult (^)(id obj1, id obj2)) block {
return [self sortedArrayUsingComparator:block];
}
- (id) reduce:(id (^)(id memo, id obj)) block withInitialMemo:(id) memo {
for (id obj in self) {
memo = block(memo, obj);
}
return memo;
}
@end
使用
filter
NSArray * allRemovedRecords = [allRecords filter:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
CKRecord *record = (CKRecord *) obj;
//NSString *filename = [self generateFileName:record];
if(record[@"status"] && [kRemoved isEqualToString:record[@"status"]]){
return YES;
} else {
return NO;
}
}];
map
return [files map:^id(id item) {
NSString * fileName = (NSString *) item;
return [fileName stringByDeletingPathExtension];
}];
sort
NSArray *sortedKeys = [[tags allKeys] sort:^NSComparisonResult(id a, id b) {
NSString *s1 = (NSString *) a;
NSString *s2 = (NSString *) b;
if([s1 isEqualToString:T(@"All")]){
return -1;
} else if([s2 isEqualToString:T(@"All")]){
return 1;
} else {
return [a compare:b];
}
}];
總結(jié)
以上通過對 NSArray 做的category 為例,實現(xiàn)了filter,sort,map,reduce 等高階函數(shù),可以減少循環(huán)的使用,同時讓代碼變得整潔。