Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using key paths in NSPredicates

I have an NSDictionary which contains (my custom) GTPerson objects. GTPerson has an NSMutableSet *parents attribute, on which I use @property and @synthesize.

Out of my NSDictionary, I want to filter all the GTPerson objects which don't have any parents, i.e. where the count of parents is 0.

I'm using the following code:

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

When I execute this, I receive the following error:

[<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.'

Why is it trying to call count on GTPerson and not on its parents attribute?

like image 320
nephilim Avatar asked Dec 08 '22 06:12

nephilim


1 Answers

The solution to your problem is to use the operator @count as in @"parents.@count == 0".

Reading the exception we see that evaluating the predicate sent the message -count to a GTPerson object. Why?

Sending -valueForKey: to a collection (in your case the collection is the NSSet which was the result of evaluating the parents component of the key path) sends -valueForKey: to each object in the collection.

In this case that results in -valueForKey: @"count" being sent to each GTPerson instance, and GTPerson isn't key value coding compliant for count.

Instead, use the @count operator to evaluate the count of the collection when you want the count of the collection, rather than the value of the key count on all objects in the collection.

like image 146
Jim Correia Avatar answered Jan 04 '23 01:01

Jim Correia