2016-12-15 23 views
1

的NSArrayindexOfObjectPassingTest方法然而,随着的NSSet您可以通过使用方法objectsPassingTest直接获取的对象。为什么NSArray具有indexOfObjectPassingTest方法而不是像NSSet这样的objectsPassingTest?

我知道,是微不足道的获取对象形成的NSArray给出的指标,但你必须代码吧:),当然在的NSSet你没有索引,所以必须返回一个对象。

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

+0

@danh在关于'filteredArrayUsingPredicate好点:'。 (我删除了他评论的答案,因为我认为他的评论比我的回答好。) –

回答

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; 
} 
相关问题