Использование ключевых путей в NSPredicates - PullRequest
4 голосов
/ 31 июля 2009

У меня есть NSDictionary, который содержит (мои пользовательские) объекты GTPerson. GTPerson имеет атрибут NSMutableSet *parents, в котором я использую @property и @synthesize.

Из моего NSDictionary я хочу отфильтровать все объекты GTPerson, у которых нет родителей, т. Е. Где количество родителей равно 0.

Я использую следующий код:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"parents.count = 0"];
NSArray *np = [[people allValues] filteredArrayUsingPredicate:predicate];

Когда я выполняю это, я получаю следующую ошибку:

[<GTPerson 0x18e300> valueForUndefinedKey:]: this class is not key value coding-compliant for the key count.

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<GTPerson 0x18e300> valueForUndefinedKey:]: this class is not key value coding-compliant for the key count.'

Почему он пытается вызвать count в GTPerson, а не в атрибуте parents?

1 Ответ

15 голосов
/ 31 июля 2009

Решением вашей проблемы является использование оператора @count как в @"parents.@count == 0".

Читая исключение, мы видим, что при оценке предиката отправлено сообщение -count объекту GTPerson. Почему?

Отправка -valueForKey: в коллекцию (в вашем случае коллекция - это NSSet, который был результатом оценки компонента parents пути ключа) отправляет -valueForKey: каждому объекту в коллекции.

В этом случае -valueForKey: @"count" отправляется каждому экземпляру GTPerson, а GTPerson не соответствует кодировке значения ключа для подсчета.

Вместо этого используйте оператор @count для оценки количества коллекции, когда вы хотите счетчик коллекции, а не значение ключа count для всех объектов в коллекции.

...