4

我有一个包含(我的自定义)GTPerson 对象的 NSDictionary。GTPerson 有一个NSMutableSet *parents属性,我在其上使用@propertyand @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.'

为什么它试图调用countGTPerson 而不是它的parents属性?

4

1 回答 1

15

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

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

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

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

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

于 2009-07-31T18:27:16.637 回答