Подтвердить что ты не робот

Как искать NSSet или NSArray для объекта, который имеет определенное значение для определенного свойства?

Как найти NSSet или NSArray для объекта, который имеет определенное значение для определенного свойства?

Пример: у меня есть NSSet с 20 объектами, и каждый объект имеет свойство type. Я хочу получить первый объект с [theObject.type isEqualToString:@"standard"].

Я помню, что можно было использовать предикаты как-то для такого рода вещей, верно?

4b9b3361

Ответ 1

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"type == %@", @"standard"];
NSArray *filteredArray = [myArray filteredArrayUsingPredicate:predicate];
id firstFoundObject = nil;
firstFoundObject =  filteredArray.count > 0 ? filteredArray.firstObject : nil;

NB: понятие первого найденного объекта в NSSet не имеет смысла, поскольку порядок объектов в наборе равен undefined.

Ответ 2

Вы можете получить отфильтрованный массив, как описано Jason и Ole, но поскольку вам нужен только один объект, я бы использовал - indexOfObjectPassingTest: (если он в массиве) или -objectPassingTest: (если он в наборе) и не создавайте второй массив.

Ответ 3

Как правило, я использую indexOfObjectPassingTest:, поскольку мне более удобно выражать свой тест в Objective-C, а не синтаксисе NSPredicate. Вот простой пример (представьте, что integerValue на самом деле было свойством):

NSArray *array = @[@0,@1,@2,@3];
NSUInteger indexOfTwo = [array indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
    return ([(NSNumber *)obj integerValue] == 2);
}];
NSUInteger indexOfFour = [array indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
    return ([(NSNumber *)obj integerValue] == 4);
}];
BOOL hasTwo = (indexOfTwo != NSNotFound);
BOOL hasFour = (indexOfFour != NSNotFound);
NSLog(@"hasTwo: %@ (index was %d)", hasTwo ? @"YES" : @"NO", indexOfTwo);
NSLog(@"hasFour: %@ (index was %d)", hasFour ? @"YES" : @"NO", indexOfFour);

Вывод этого кода:

hasTwo: YES (index was 2)
hasFour: NO (index was 2147483647)

Ответ 4

NSArray* results = [theFullArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF.type LIKE[cd] %@", @"standard"]];