简而言之,我正在寻找正确的谓词格式来索引到对象的字典属性。
我有一个myObject实例数组,每个实例都有一个属性CPDictionary(NSMutableDictionary) extAttributes,我试图允许基于extAttributes中的值进行过滤。我定义我的谓词如下
[CPPredicate predicateWithFormat:@"extAttributes[%K] like[c] %@",key,val]
我不确定正确的键路径是什么。阅读关于NSPredicate的文档,似乎"extAttributes[%k]"可能是一个数组的索引,而不是一个字典。我已经尝试了几种替代方案,这是唯一一个不会出错的。在检查结果对象时,谓词对象中的表达式看起来是正确的。然而,它没有达到预期的结果。
看起来您可能混淆了数组和字典引用。只需使用关键路径(以点分隔的元素名称)来引用嵌套的元素或对象属性,概念上类似于:
[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];