Оценка NSPredicate на NSArray (без фильтрации)

122
12

Можно ли оценить NSPredicate на NSArray, не имея NSPredicate, начинающего отфильтровывать объекты в массиве?


Например, скажем, у меня есть следующий предикат, который просто проверяет количество объектов в массиве:


NSPredicate *pred = [NSPredicate predicateWithFormat:@"count == 3"];
NSArray *list = [NSArray arrayWithObjects:@"uno", @"dos", @"volver", nil];
BOOL match = [pred evaluateWithObject:list];

Это приведет к сбою, поскольку pred попытается извлечь ключ "count" из первого объекта в массиве вместо самого массива.

спросил(а) 2011-10-18T13:16:00+04:00 9 лет, 5 месяцев назад
1
Решение
167

Используйте оператор SIZE для NSPredicate, который эквивалентен методу подсчета NSArray.

NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF[SIZE] == 3"];
NSArray *list = [NSArray arrayWithObjects:@"uno", @"dos", @"volver", nil];
BOOL match = [pred evaluateWithObject:list];

ответил(а) 2011-10-18T13:51:00+04:00 9 лет, 5 месяцев назад
136

Альтернативой использованию [SIZE] в вашей строке форматированного формата является следующее:


NSPredicate *p = [NSPredicate predicateWithFormat:@"@count = 3"];

@count является одним из простых операторов keypath ключей и весьма полезен. Это гораздо более распространено, чем использовать [SIZE], хотя оба они в порядке.

ответил(а) 2011-10-22T18:38:00+04:00 9 лет, 5 месяцев назад
62

Например, вы можете создать категорию с необходимыми методами:


@interface NSPredicate (myCategory)
- (BOOL)evaluateWithArray:(id)array;
// other methods
@end

и в .m файле реализуют его следующим образом:


- (BOOL)evaluateWithArray:(id)array {
if ([array isKindOfClass:[NSArray class]])
return [self evaluateWithObject:array];
return NO;
}

Надеюсь, это поможет.

ответил(а) 2011-10-18T13:30:00+04:00 9 лет, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема