首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在obj-c的ruby类Map方法中迭代时跳过对象

如何在obj-c的ruby类Map方法中迭代时跳过对象
EN

Stack Overflow用户
提问于 2013-08-21 14:43:03
回答 3查看 418关注 0票数 3

使用答案here,该方法实现了与obj-c中的ruby地图类似的功能:

代码语言:javascript
运行
复制
- (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;
}

我的问题是,如果在应用块时发生了错误,我如何跳过对象?Typically要跳过枚举器中的某个内容--只需使用return命令,但是在上面的方法中这不是一个选项,因为预期该块会返回某些内容。

在本例中,我使用return跳过,但得到了一个错误:

代码语言:javascript
运行
复制
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;
}];

我目前处理它的方法是简单地返回一个空对象,然后将它们从最后的数组中删除。但我相信肯定还有更好的办法。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-21 15:44:18

如果实现与上面显示的类似,那么只将块结果应用于中间值,然后在将其添加到结果数组之前对其进行检查是有意义的。就像这样:

代码语言:javascript
运行
复制
- (NSArray *)mapObjectsUsingBlock:(id (^)(id obj, NSUInteger idx))block {
    NSMutableArray *result = [NSMutableArray arrayWithCapacity:[self count]];
    [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        id blockResult = block( obj, idx );
        if( result != nil ){
          [result addObject:blockResult];
        }
    }];
    return result;
}
票数 5
EN

Stack Overflow用户

发布于 2013-08-21 16:06:00

一个快速的解决办法是:编写自己的变体,它使用NSPointerArray而不是NSArray。NSPointerArray可以保持零。然后可以保留顺序,您可以使用nil来指示错误(假设NSNull是一个有效值,不能用来表示错误)。使用NSPointerArray,您的块将返回零。

票数 1
EN

Stack Overflow用户

发布于 2013-08-21 14:47:28

这只是对任何框架或库mapObjectsUsingBlock:的限制(这不是一个标准的Apple )。

然而,实现数组映射功能并不困难,因此您可以轻松地编写自己的版本来处理来自块参数的nil返回值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18360559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档