4

(私のカスタム)GTPersonオブジェクトを含むNSDictionaryがあります。GTPersonには、NSMutableSet *parents私が使用する属性とが@propertyあり@synthesizeます。

NSDictionaryから、親を持たない、つまり親の数が0であるすべてのGTPersonオブジェクトをフィルタリングしたいと思います。

私は次のコードを使用しています:

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

4

1 に答える 1

15

問題の解決策は、演算子@countをのように使用すること@"parents.@count == 0"です。

例外を読むと、述語を評価するとメッセージ-countが GTPerson オブジェクトに送信されたことがわかります。なんで?

コレクションへの送信-valueForKey:(この場合、コレクションはparents、キー パスのコンポーネントを評価した結果の NSSet です)-valueForKey:は、コレクション内の各オブジェクトに送信します。

この場合、-valueForKey: @"count"各 GTPerson インスタンスに送信されることになり、GTPerson はカウントのキー値コーディングに準拠していません。

代わりに、コレクション内のすべてのオブジェクト@countのキーの値ではなく、コレクションの数が必要な場合は、演算子を使用してコレクションの数を評価します。count

于 2009-07-31T18:27:16.637 に答える