Objective-C 实现 map

Swift 中有一系列的高阶函数可以使用,比如 map/filter 等。但是 Objective-C 这门古老的语言没有。那么要如何来实现呢?

map

map 函数其实就是一个数组进行遍历,然后遵循某一原则得到一个新数组。

可以用 Category 来进行方法扩展。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@interface NSArray<__covariant ObjectType> (ACKit)
- (NSArray *)ac_mapUsingBlock:(id (^)(ObjectType obj, NSUInteger idx))block;
@end
@implementation NSArray (ACKit)
- (NSArray *)ac_mapUsingBlock:(id _Nonnull (^)(id _Nonnull, NSUInteger))block {
NSMutableArray *resultArr = [NSMutableArray arrayWithCapacity:self.count];
[self enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
[resultArr addObject:block(obj, idx)];
}];
return resultArr;
}
@end

使用__covariant ObjectType是可以更方便的使用泛型。上述的 map 方法在使用上也比较简单。看🌰。

1
2
3
4
5
NSArray<NSString *> *arr = @[@"test", @"key"];
NSArray *newArr = [arr ac_mapUsingBlock:^id _Nonnull(NSString * _Nonnull obj, NSUInteger idx) {
return @(obj.length);
}];

通过 map 函数,可以方便的把一个全是字符串的数组,转成一个记录字符串长度的新数组。

末尾

先上个 map。后续争取上多几个~~~(逃