2

简而言之,我正在寻找正确的谓词格式来索引对象上的字典属性。

我有一个 myObject 实例数组,每个实例都有一个属性 CPDictionary(NSMutableDictionary) extAttributes,我试图允许基于 extAttributes 中的值进行过滤。我将我的谓词定义如下

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

我不确定正确的密钥路径是什么。阅读关于 NSPredicate 的文档,似乎“extAttributes[%k]”可能是数组的索引,而不是字典。我尝试了几种替代方法,这是唯一一种不会出错的方法。检查结果对象时,谓词对象中的表达式似乎是正确的。但是,它没有预期的结果。

4

1 回答 1

3

看起来您可能会混淆数组和字典引用。只需使用键路径(点分隔的元素名称)来引用嵌套元素或对象属性,概念上是这样的:

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

再说一次,我对卡布奇诺不是很熟悉,所以我不确定他们是否在这里做了一些稍微不同的事情,但这就是它在 Cocoa 和 Cocoa touch 中的工作方式。

编辑

要动态计算密钥,您需要做的就是编写一个密钥路径字符串:

 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 回答