#objective-c #cocoa #nsarray #nspredicate
#objective-c #какао #nsarray #nspredicate
Вопрос:
Возможно ли оценить NSPredicate в NSArray, не заставляя NSPredicate начинать отфильтровывать объекты в массиве?
Например, скажем, у меня есть следующий предикат, который просто проверяет количество объектов в массиве:
NSPredicate *pred = [NSPredicate predicateWithFormat:@"count == 3"];
NSArray *list = [NSArray arrayWithObjects:@"uno", @"dos", @"volver", nil];
BOOL match = [pred evaluateWithObject:list];
Это приведет к сбою, поскольку pred попытается извлечь ключ «count» из первого объекта в массиве вместо самого массива.
Комментарии:
1. Кажется, вам нужно оценивать с помощью list , а не @»123″ . И вы можете использовать оператор SIZE, который эквивалентен методу count в NSArray .
2. Вы правы, я только что исправил опечатку
Ответ №1:
Используйте оператор РАЗМЕРА NSPredicate, который эквивалентен методу подсчета NSArray.
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF[SIZE] == 3"];
NSArray *list = [NSArray arrayWithObjects:@"uno", @"dos", @"volver", nil];
BOOL match = [pred evaluateWithObject:list];
Комментарии:
1. Зачем вам проходить этот довольно окольный путь? Просто сравните
count
3
напрямую.2. @Джейкоб Релкин, да. Это действительно лучший способ сделать это. Но OP хотел знать, почему его предикат не работает, а не какой самый простой способ сравнить количество массивов 😉
3. Спасибо. Я использовал это для фильтрации массива словарей, удалив записи, в которых содержался один ключ, и пустой массив.
Ответ №2:
Альтернативой использованию [SIZE]
в вашей строке формата предиката является выполнение этого:
NSPredicate *p = [NSPredicate predicateWithFormat:@"@count = 3"];
@count
является одним из простых операторов ключевого пути для сбора данных и весьма полезен. Его гораздо чаще используют, чем [SIZE]
, хотя оба они хороши.
Ответ №3:
Например, вы можете создать категорию с нужными вам методами:
@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;
}
Надеюсь, это поможет.