2011-09-22 40 views
2

总之,我正在寻找正确的谓词格式来索引对象的字典属性。关键字路径为谓词中的对象的字典属性的元素?

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

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

我不知道什么是正确的键路径会是这样。阅读关于NSPredicate的文档,似乎“extAttributes [%k]”可能是数组索引,而不是字典。我已经尝试了几种选择,这是唯一一个不会出错的选择。在检查结果对象时,谓词对象中的表达式看起来是正确的。但是,它没有预期的结果。

+0

我通过实施'解决了这个 - (ID)valueForUndefinedKey:(ID)key'上myObject的。 ' - (id)valueForUndefinedKey:(id)key {ret = [extAttributes objectForKey:key]; return ret; } ' 然后它就是'[CPPredicate predicateWithFormat:@“%K like [c]%@”,key,val];' – jlujan

+0

这是一个破解。不要这样做。使用关键路径。 – jlehr

+0

这是它的一个副作用,它已经实现了将随机列添加到表视图。正确的关键路径是什么? – jlujan

回答

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]; 

编辑

可可/可可触摸的等效代码如下:

NSString *keyPath = [NSString stringWithFormat:@"%@.%@", @"extAttributes", key]; 
[NSPredicate predicateWithFormat:@"%K like[c] %@", keyPath, val]; 
+0

谢谢,但我不认为这会做我所要的。我不确定你的例子中有什么'myNestedElementName',或者我可能会误解。 '[[myObject extAttributes] objectForKey:key]'将会正常使用。我已经尝试过[CPPredicate predicateWithFormat:@“extAttributes。%K like [c]%@”,key,val];'这也不起作用。 – jlujan

+1

我会在我的答案中添加一些额外的细节来澄清。 – jlehr

+0

这就是机票!谢谢。 – jlujan

相关问题