我正在尝试编写谓词来比较云工具包数据库中的两个键。我能够找到的所有文档只允许您将一个键与设定值进行比较。有没有办法在swift中编写谓词来比较两个键?
我能提出的最接近的是:
let pred = NSPredicate(format: "%K == %K", "keyA", "keyB")!
但这一直在让我崩溃。
答案 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\")")