NSPredicate predicateWithFormat 从键中删除 $ 符号

Posted

技术标签:

【中文标题】NSPredicate predicateWithFormat 从键中删除 $ 符号【英文标题】:NSPredicate predicateWithFormat dropping $ symbol from key 【发布时间】:2014-02-20 18:27:11 【问题描述】:

我正在使用 NSPredicate 过滤 NSDictionary 对象的 NSArray 的内容。没什么疯狂的。我想在字典中检查相同搜索字符串的三个不同值。这是我传递给[NSPredicate predicateWithFormat:]的字符串:

($ECInstanceLabel CONTAINS[c] filterMe) OR (SubLabel1 CONTAINS[c] filterMe) OR (SubLabel2 CONTAINS[c] filterMe)

当我执行此操作时,会创建一个新 NSPredicate 的有效实例,但当我执行 [NSArray filteredArrayUsingPredicate:] 时,应用程序会引发异常。

例外是:

'NSInvalidArgumentException',原因:'Can't get value for 'ECInstanceLabel' in bindings  .'

我认为部分问题在于我的格式字符串指定第一个字典键值为$ECInstanceLabel,但不知何故$ 被转义了。我试过手动转义这个字符,但是当我尝试创建谓词时程序崩溃了,所以我不认为$ 符号被识别为可转义字符。

我可能遗漏了什么想法或明显的东西?

提前致谢。

【问题讨论】:

【参考方案1】:

$var 用在 变量 的谓词中,以后可以替换。 如果您的密钥包含$ 或其他特殊字符,请使用%K 扩展:

 [NSPredicate predicateWithFormat:@"(%K CONTAINS[c] %@) OR (SubLabel1 CONTAINS[c] %@) OR (SubLabel2 CONTAINS[c] %@)",
          @"$ECInstanceLabel", searchTerm, searchTerm, searchTerm]

并且对搜索词使用%@ 格式而不是内联,以避免 如果搜索词包含特殊字符,则会出错。

当然,您可以将%@ 用于所有键,但在这种情况下,您需要它仅用于 第一个包含特殊字符的键。

【讨论】:

我不知道 %K 扩展选项。你能举个例子说明如何用三个只需要一个 searchTerm 参数的 CONTAINS 语句来编写吗? @itslittlejohn:查看更新的答案,您只需重复参数即可。 好的,很公平。我传递字符串内联的原因是为了避免多次传递搜索词。 NSString stringWithFormat 很好地处理了这个。 @itslittlejohn:但是一旦搜索词包含引号,就会导致错误。 (我永远不会混用 stringWithFormatpredicateWithFormat。)

以上是关于NSPredicate predicateWithFormat 从键中删除 $ 符号的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate

NSPredicate 谓词

子查询中的 NSPredicate

NSPredicate 问题

NSPredicate 字符串

NSPredicate == 查询