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:但是一旦搜索词包含引号,就会导致错误。 (我永远不会混用stringWithFormat
和 predicateWithFormat
。)以上是关于NSPredicate predicateWithFormat 从键中删除 $ 符号的主要内容,如果未能解决你的问题,请参考以下文章