Ios 为什么NSArray有indexOfObjectPassingTest方法,而没有像NSSet那样的objectsPassingTest方法?

Ios 为什么NSArray有indexOfObjectPassingTest方法,而没有像NSSet那样的objectsPassingTest方法?,ios,objective-c,nsarray,nsset,Ios,Objective C,Nsarray,Nsset,NSArray具有indexOfObjectPassingTest方法,但是使用NSSet方法,您可以使用OBJECTS PASSINGTEST方法直接获取对象 我知道,在给定索引的情况下,从NSArray获取对象很简单,但您必须将其编码:),当然在NSSet中,您没有索引,因此它必须返回一个对象 所以问题是为什么这些数据类型对于同一个任务有不同的方法(通过一些测试来查找元素),而不是实现objectsPassingTest。,因为从一个索引到另一个对象很简单,但从一个对象到另一个索引却不是 我

NSArray具有indexOfObjectPassingTest方法,但是使用NSSet方法,您可以使用OBJECTS PASSINGTEST方法直接获取对象

我知道,在给定索引的情况下,从NSArray获取对象很简单,但您必须将其编码:),当然在NSSet中,您没有索引,因此它必须返回一个对象


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

,因为从一个索引到另一个对象很简单,但从一个对象到另一个索引却不是

我不知道为什么在
NSArray
中没有类比。仔细阅读文档,相当多的收集方法都有一个多态的孪生子,但不是这个

可能很适合大多数问题,但为了匹配
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;
}

@danh使用predicate:对
过滤器进行了很好的说明。(我删除了他评论的答案,因为我认为他的评论比我的答案好。)