Как искать NSSet или NSArray для объекта, который имеет определенное значение для определенного свойства?
Как найти NSSet или NSArray для объекта, который имеет определенное значение для определенного свойства?
Пример: у меня есть NSSet с 20 объектами, и каждый объект имеет свойство type
. Я хочу получить первый объект с [theObject.type isEqualToString:@"standard"]
.
Я помню, что можно было использовать предикаты как-то для такого рода вещей, верно?
Ответы
Ответ 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"]];