2012-08-23 5 views
1

У меня есть NSArray пользовательских объектов, все из которых имеют @property name типа NSString. Как я могу быстро перечислить массив и создать новый массив, который содержит только те объекты, у которых есть определенное слово в свойстве name?Быстрый поиск объектов в NSArray

Например:

CustomObject *firstObject = [[CustomObject alloc] init]; 
firstObject.name = @"dog"; 

CustomObject *secondObject = [[CustomObject alloc] init]; 
secondObject.name = @"cat"; 

CustomObject *thirdObject = [[CustomObject alloc] init]; 
thirdObject.name = @"dogs are fun"; 

NSMutableArray *testArray = [NSMutableArray arrayWithObjects:firstObject, 
                  secondObject, 
                  thirdObject, 
                  nil]; 

// I want to create a new array that contains all objects that have the word 
// "dog" in their name property. 

Я знаю, что я мог бы использовать цикл, как так:

NSMutableArray *newArray = [NSMutableArray array]; 
for (CustomObject *obj in testArray) 
{ 
    if ([obj.name rangeOfString:@"dog"].location == NSNotFound) { 
     //string wasn't found 
    } 

    else { 
     [newArray addObject:obj]; 
    } 
} 

Но есть более эффективный способ? Благодаря!

ответ

5
NSString *searchString = @"dog"; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.name contains %@", searchString]; 
NSArray *filteredArray = [testArray filteredArrayUsingPredicate:predicate]; 
+0

Я не знаю, каков будет синтаксис, но не следует ли проверять предикат для SELF.name вместо САМ? –

+0

@DrummerB Это не сработает, потому что testArray содержит объекты, а не строки. Я хочу искать слово в свойстве объекта, а не в самом объекте. – Anthony

+0

Право, извините, исправлено. – DrummerB

1

Пожалуйста, взгляните на NSPredicates! Они очень эффективны при поиске/фильтрации результатов массива. Это

+1

Возможно, пример моей конкретной ситуации? – Anthony

Смежные вопросы