美文网首页
给OC数组添加几个函数式扩展方法

给OC数组添加几个函数式扩展方法

作者: ChoiKarl | 来源:发表于2018-01-16 15:48 被阅读31次

写了很长一段时间的Swift,现在转回OC,也想使用Swift里的函数式写法,就给OC数组扩展几个方法.

#import <Foundation/Foundation.h>
typedef id(^MapBlock)(id item);
typedef BOOL(^FilterBlock)(id item);
typedef NSComparisonResult(^SortedBlock)(id item1, id item2);
typedef void(^ForEachBlock)(NSUInteger i, id item);
typedef BOOL(^ContainsBlock)(id item);


@interface NSArray (FunctionalExtension)
@property(nonatomic, copy, readonly) NSArray* (^map)(MapBlock block);
@property(nonatomic, copy, readonly) NSArray* (^filter)(FilterBlock block);
@property(nonatomic, copy, readonly) NSArray* (^sorted)(SortedBlock block);
@property(nonatomic, copy, readonly) NSArray* (^forEach)(ForEachBlock block);
@property(nonatomic, copy, readonly) BOOL (^contains)(ContainsBlock block);

@end

@implementation NSArray (FunctionalExtension)
- (NSArray *(^)(MapBlock))map {
    return ^(MapBlock b) {
        NSMutableArray *a = [NSMutableArray arrayWithCapacity:self.count];
        for (id obj in self) {
            [a addObject:b(obj)];
        }
        return [a copy];
    };
}

- (NSArray *(^)(FilterBlock))filter {
    return ^(FilterBlock b) {
        NSMutableArray *a = [NSMutableArray arrayWithCapacity:self.count];
        for (id obj in self) {
            if (b(obj)) {
                [a addObject:obj];
            }
        }
        return [a copy];
    };
}

- (NSArray *(^)(SortedBlock))sorted {
    return ^(SortedBlock b) {
        return [self sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
            return b(obj1, obj2);
        }];
    };
}

- (NSArray *(^)(ForEachBlock))forEach {
    return ^(ForEachBlock b) {
        for (NSUInteger i = 0; i < self.count; i++) {
            b(i, self[i]);
        }
        return self;
    };
}

- (BOOL(^)(ContainsBlock))contains {
    return ^(ContainsBlock b) {
        BOOL flag = NO;
        for (id obj in self) {
            if (b(obj)) {
                flag = YES;
                break;
            }
        }
        return flag;
    };
}
@end

使用:

    NSArray *numberArray = @[@1, @11, @4, @3, @22, @2];
    
    NSArray *newArray =
    numberArray.filter(^BOOL(NSNumber *item) {
        return item.integerValue < 22;
    }).sorted(^NSComparisonResult(NSNumber *item1, NSNumber *item2) {
        return item1 < item2;
    }).map(^id(NSNumber *item) {
        return [NSString stringWithFormat:@"%@", item];
    }).forEach(^(NSUInteger i, id item) {
        NSLog(@"%@", item);
    });
    
    BOOL isContain = newArray.contains(^BOOL(NSString *item) {
        if ([item isEqualToString:@"100"]) {
            return YES;
        }
        return NO;
    });
    NSLog(@"isContain => %d", isContain);

相关文章

  • 给OC数组添加几个函数式扩展方法

    写了很长一段时间的Swift,现在转回OC,也想使用Swift里的函数式写法,就给OC数组扩展几个方法. 使用:

  • 建立JS库文件

    建立库的方式 函数式 对象式 函数式 对象式 给JS添加连缀(链式)操作 给Base对象添加原型方法 1.添加CS...

  • 十五、字符串转数字

    字符串转数组 字符串 *待扩展:传递与复制扩展 函数式编程和改变原始数据的编程方法

  • Swift Extension(扩展)

    Swift中的扩展,类似OC中的分类Category 扩展可以为枚举、结构体、类、协议添加新功能 可以添加方法、计...

  • 扩展(Extension)

    Swift中的扩展,有点类似OC中的分类Categoary 扩展可以为枚举 结构体 类 协议添加新功能可以添加方法...

  • ES6扩展运算符...

    数组的扩展运算符应用1.替代函数的apply方法 另一个例子是通过push函数,将一个数组添加到另一个数组的尾部。...

  • 函数式编程入门系列二

    数组的函数式编程1.数组的函数式方法mapfilter函数2.连接操作concatAll函数3.reduce函数4...

  • Swift5.1学习随笔之扩展(Extension)

    Swift中的扩展,类似于OC中的分类Category 扩展可以为枚举、类、结构体、协议添加新功能可以添加方法、计...

  • 数组的简单总结

    定义数组: 构造函数 字面量 数组的长度 arr.length 数组的方法: 基本方法(添加,删除,修改) 栈方法...

  • 关于UITableView-给UITableViewCell添加

    一:首先给UIView添加一个扩展,加入添加圆角的方法OC实现 二:在- (void)tableView:(UIT...

网友评论

      本文标题:给OC数组添加几个函数式扩展方法

      本文链接:https://www.haomeiwen.com/subject/bsisoxtx.html