为什么NSArray有方法indexOfObjectPassingTest而不是像NSSet那样的objectsPassingTest?

时间:2016-12-15 14:22:18

标签: ios objective-c nsarray nsset

NSArray indexOfObjectPassingTest 方法但是使用 NSSet ,您可以使用方法直接获取对象> objectsPassingTest

我知道,给定索引的对象形成一个 NSArray 是微不足道的,但是你必须编写代码:),当然在 NSSet 你没有有索引所以必须返回一个Object。

所以问题是为什么这个数据类型对同一个任务有不同的方法(通过传递一些测试找到一个元素)而不是实现 objectsPassingTest ?。

2 个答案:

答案 0 :(得分:1)

我不知道为什么NSArray中没有类比。仔细阅读文档,很多收集方法都有一个多态的双胞胎,但不是这个。

filteredArrayUsingPredicate:可能会很好地适应大多数问题,但为了匹配NSSet签名,像这样扩展NSArray是不合理的:

// NSArray+NotUnreasonableAddition.h
@interface NSArray (NotUnreasonableAddition)
- (NSArray *)objectsPassingTest:(BOOL (^)(id, BOOL *))test; 
@end

// NSArray+NotUnreasonableAddition.m
@implementation NSArray (NotUnreasonableAddition)

- (NSArray *)objectsPassingTest:(BOOL (^)(id, BOOL *))test {
    NSMutableArray *result = [NSMutableArray new];
    for (id obj in self) {
        BOOL stop = NO;
        if (test(obj, &stop)) [result addObject:obj];
        if (stop) break;
    }
    return result;
}

答案 1 :(得分:0)

因为从索引到对象是微不足道的,但是从对象到索引不是。