使用此处的答案,此方法可以实现类似于 obj-c 中的 ruby 映射:
- (NSArray *)mapObjectsUsingBlock:(id (^)(id obj, NSUInteger idx))block {
NSMutableArray *result = [NSMutableArray arrayWithCapacity:[self count]];
[self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[result addObject:block(obj, idx)];
}];
return result;
}
我的问题是如果在应用块时发生错误,我该如何跳过一个对象?通常要跳过枚举器中的某些内容,只需使用该return
命令,但这不是上述方法中的选项,因为该块预计会返回某些内容。
在此示例中,我使用return
跳过但收到错误:
NSArray *mappedArray = [objArray mapObjectsUsingBlock:^(id obj, NSUInteger i) {
// i don't want this obj to be included in final array
// so I try to skip it
return; // ERROR:incompatible block pointer types sending
// 'void(^)(__strong id, NSUInteger)' to parameter of type
// 'id(^)(__strong id, NSUInteger)'
// else do some processing
return soupedUpObj;
}];
我目前的解决方法是简单地返回一个空对象,然后将它们从最终数组中删除。但我确信一定有比这更好的方法。