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

#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;
}
  

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