NSArray 有 indexOfObjectPassingTest 方法但是使用 NSSet ,您可以使用方法直接获取对象> objectsPassingTest
我知道,给定索引的对象形成一个 NSArray 是微不足道的,但是你必须编写代码:),当然在 NSSet 你没有有索引所以必须返回一个Object。
所以问题是为什么这个数据类型对同一个任务有不同的方法(通过传递一些测试找到一个元素)而不是实现 objectsPassingTest ?。
答案 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)
因为从索引到对象是微不足道的,但是从对象到索引不是。