谓词比较两个键

时间:2015-02-13 13:48:53

标签: ios swift nspredicate cloudkit

我正在尝试编写谓词来比较云工具包数据库中的两个键。我能够找到的所有文档只允许您将一个键与设定值进行比较。有没有办法在swift中编写谓词来比较两个键?

我能提出的最接近的是:

 let pred = NSPredicate(format: "%K == %K", "keyA", "keyB")!

但这一直在让我崩溃。

2 个答案:

答案 0 :(得分:0)

在R.H.S上使用%@,像这样输入%k ..

%@是对象值的var arg替换 - 通常是字符串,数字或日期。

%K是密钥路径的var arg替换。

let pred = (NSPredicate(format: "%K == %@", "keyA", "keyB")!)

答案 1 :(得分:0)

你真的想比较两把钥匙吗?或者您是否尝试比较与两个键相关的值?谓词中%@和%K之间的差异是%@将被适当地转义,而%K将不会被转义。

所以:

NSPredicate(format:"value = %@", "Fred")   // yields 'value = "Fred"'

虽然:

NSPredicate(format:"value = %K", "Fred")   // yields 'value = Fred'

当您将一个键名称作为参数传递给谓词时,您希望使用%K,而您希望使用'%@'如果你传递了一个值。

从你的例子,标题和问题中,如果你确保两个字段/键的值相同的谓词,很难弄清楚你真正想要做什么,你想用

NSPredicate(format:"%K = %K", "key1", "key2")

正如你所做的那样。

如果您尝试检查特定键是否具有特定值,请使用:

NSPredicate(format:"%K = %@", "key1", "value1")

你单独给出的代码执行得很好,在哪里以及究竟是什么崩溃,给我们更多的背景。

根据您要在两个不同字段中过滤包含相同值的记录的更多信息,CloudKit似乎不仅仅支持field OP field field OP constant ,我可以建议的最好的工作是:

let predicate = NSPredicate(format: "(gender1 = \"male\" AND gender2 = \"male\") OR (gender1 = \"female\" AND gender2 = \"female\")")