在NSPredicates中使用关键路径

时间:2009-07-31 15:08:44

标签: objective-c key-value-observing key-value-coding

我有一个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.'

为什么要在GTPerson上调用count而不是在parents属性上调用?{/ p>

1 个答案:

答案 0 :(得分:15)

问题的解决方案是使用@count中的运算符@"parents.@count == 0"

读取异常,我们看到评估谓词将消息-count发送到GTPerson对象。为什么呢?

-valueForKey:发送到集合(在您的情况下,集合是NSSet,它是评估密钥路径的parents组件的结果)将-valueForKey:发送到集合中的每个对象采集。

在这种情况下导致-valueForKey: @"count"被发送到每个GTPerson实例,并且GTPerson不是符合计数的键值编码。

相反,当您想要集合的计数时,使用@count运算符来计算集合的计数,而不是集合中所有对象上的键count的值。