2016-12-15 4 views
1

NSArray имеют indexOfObjectPassingTest метод, однако с NSSet вы можете получить непосредственно объект с помощью метода objectsPassingTest.Почему NSArray имеет метод indexOfObjectPassingTest, а не объектыPassingTest, например NSSet?

Я знаю, тривиальна получить объект образуют 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; 
} 
Смежные вопросы