2009-07-31 4 views
4

Ich habe eine NSDictionary die (meine benutzerdefinierte) GTPerson Objekte enthält. GTPerson hat ein NSMutableSet *parents Attribut, auf das ich @property und @synthesize verwenden.Mit Schlüsselpfade in NSPredicates

Aus meinem NSDictionary, ich will alle GTPerson Objekte filtern, die haben keine Eltern, also dort, wo die Anzahl der Eltern ist 0.

ich den folgenden Code bin mit:

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

Wenn ich dies ausführen, erhalte ich folgende Fehlermeldung:

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

Warum ist es versuchen count auf GTPerson rufen und nicht auf seine parents Attri Bute?

Antwort

15

Die Lösung für Ihr Problem besteht darin, den Operator @count wie in @"[email protected] == 0" zu verwenden.

die Ausnahme Lesen wir sehen, dass das Prädikat Auswertung des Nachrichtenobjekt -count zu einem GTPerson gesendet. Warum?

Senden von -valueForKey: an eine Sammlung (in Ihrem Fall sendet die Auflistung das NSSet, das das Ergebnis der Auswertung der parents Komponente des Schlüsselpfads war) sendet -valueForKey: an jedes Objekt in der Auflistung.

In diesem Fall wird -valueForKey: @"count" an jede GTPerson-Instanz gesendet, und GTPerson ist keine Schlüsselwertcodierung, die für die Zählung geeignet ist.

Verwenden Sie stattdessen den @count-Operator, um die Anzahl der Auflistung zu berechnen, wenn Sie die Anzahl der Auflistung lieber als den Wert des Schlüssels count für alle Objekte in der Auflistung möchten.