比较两个键的谓词

Predicate comparing two keys

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

我能想到的最接近的是:

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

但这让我一直崩溃。

像这样在 %k 的 R.H.S 一侧使用 %@..

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

%K 是关键路径的可变参数替换。

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

您真的要比较两个键吗?或者您是否正在尝试比较与两个键关联的值?谓词中的 %@ 和 %K 之间的区别是 %@ 将被适当地转义,而 %K 不会。

所以:

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

同时:

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

您想在将键名作为参数传递给谓词时使用 %K,而在传递值时想使用“%@”。

从你的例子、标题和问题来看,很难弄清楚你到底想做什么,如果你的谓词确保两个 fields/keys 的值相同,你想要使用

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\")")