2

つまり、オブジェクトのディクショナリ属性にインデックスを付けるための正しい述語形式を探しています。

それぞれ属性 CPDictionary(NSMutableDictionary) extAttributes を持つ myObject インスタンスの配列があり、extAttributes の値に基づいてフィルタリングできるようにしようとしています。次のように述語を定義しています

[CPPredicate predicateWithFormat:@"extAttributes[%K] like[c] %@",key,val]

これに対する正しいキーパスが何であるかはわかりません。NSPredicate のドキュメントを読むと、「extAttributes[%k]」は辞書ではなく、配列へのインデックスのように見えます。私はいくつかの代替手段を試しましたが、これはエラーにならない唯一のものです。結果のオブジェクトを調べると、述語オブジェクトの式は正しいように見えます。ただし、意図した結果にはなりません。

4

1 に答える 1

3

配列参照と辞書参照を混同しているようです。キー パス (ドット区切りの要素名) を使用して、ネストされた要素またはオブジェクト プロパティを参照します。概念的には次のようになります。

[CPPredicate predicateWithFormat:@"%K like[c] %@", @"extAttributes.myNestedElementName", val];

繰り返しになりますが、私はカプチーノにあまり詳しくないので、ここで少し違うことをしたかどうかはわかりませんが、これはココアとココアタッチで機能する方法です.

編集

キーを動的に計算するには、キー パス文字列を作成するだけです。

 var keyPath = [CPString stringWithFormat:@"%@.%@", @"extAttributes", key];

次のように述語を作成できるようになりました。

[CPPredicate predicateWithFormat:@"%K like[c] %@", keyPath, val];

編集

Cocoa/Cocoa touch での同等のコードは次のようになります。

NSString *keyPath = [NSString stringWithFormat:@"%@.%@", @"extAttributes", key];
[NSPredicate predicateWithFormat:@"%K like[c] %@", keyPath, val];
于 2011-09-22T18:42:12.537 に答える