在 objective-c 上玩玩函數(shù)式編程

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)的使用,同時讓代碼變得整潔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,365評論 4 61
  • 轉(zhuǎn)載自:https://github.com/Tim9Liu9/TimLiu-iOS 目錄 UI下拉刷新模糊效果A...
    袁俊亮技術(shù)博客閱讀 12,147評論 9 105
  • 去年12月,女兒因為肺炎而住院。之前連續(xù)六天高燒,之后五天住院,搞得我灰頭土臉,疲憊不堪。陪護的我,自責(zé)、困頓,加...
    共剪西窗燭閱讀 1,629評論 0 3
  • #打卡# 05月26日 周五 天氣多云 身體狀態(tài)8.6分 【我的進度】日跑2公里第334天,先堅持1年;每日5點...
    龍馬行天下閱讀 208評論 0 1
  • 每每遇到合適的人,總會將自己的夢想激情滿滿地向他們描繪一遍,好像在這過程中那個美好的夢似乎已經(jīng)實現(xiàn),自己似乎變得與...
    飛翔的餅閱讀 372評論 0 1

友情鏈接更多精彩內(nèi)容