Ios 比较两个键的谓词

Ios 比较两个键的谓词,ios,swift,nspredicate,cloudkit,Ios,Swift,Nspredicate,Cloudkit,我试图编写一个谓词来比较云工具包数据库中的两个键。我能找到的所有文档只允许您将一个键与一个设定值进行比较。有没有办法用swift写一个谓词来比较两个键 我能想到的最接近的方法是: let pred = NSPredicate(format: "%K == %K", "keyA", "keyB")! 但这一直困扰着我。在R.H.S端使用%@而不是像这样使用%k %@是对象值的var arg替换,通常是字符串、数字或日期 %K是键路径的var arg替换 let pred = (NSPredic

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

我能想到的最接近的方法是:

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

但这一直困扰着我。

在R.H.S端使用%@而不是像这样使用%k

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

%K是键路径的var arg替换

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

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

因此:

而:

NSPredicate(format:"value = %K", "Fred")   // yields 'value = Fred'
在将键名作为参数传递给谓词时,要使用
%K
,而在传递值时要使用“%@”

从您的示例、标题和问题中,很难弄清楚您实际上在做什么,如果您使用一个谓词来确保两个字段/键的值相同,那么您希望使用

NSPredicate(format:"%K = %K", "key1", "key2")
正如你所做的

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

NSPredicate(format:"%K = %@", "key1", "value1")
您单独给出的代码执行得很好,崩溃的具体位置和原因,为我们提供了更多的上下文

根据您希望在两个不同字段中筛选包含相同值的记录的进一步信息,CloudKit似乎不支持
字段操作字段
仅支持
字段操作常量
,鉴于此,我建议的最佳解决方法是:

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

为什么要在
()
中包装
NSPredicate
?以一个非元组为例,它创建了元组类型
(NSPredicate)
@Kirsteins一个元组与单个值是无法区分的
(NSPredicate)
NSPredicate
相同。此外,如果我比较两个不同键的值,为什么RHS上不是%K?我想收回所有keyA与keyB匹配的记录。有关%@与%K的更多信息,请参阅我的答案,但您似乎需要为我们提供更多上下文来解决您的问题,因为所给出的示例执行得很好。而且,fwiw,您希望比较与两个键相关的值,而不是两个键。因此,特别是,键1和键2都具有相同类型的数据。男性或女性。我想找到key1与key2匹配的所有结果。如果我的术语有误,我很抱歉。我有点不懂。所以每个记录都包含两个不同的性别字段,您想返回它们相同的记录吗?然后只需使用
NSPredicate(格式:“genderField1=genderField2”)
,避免整个问题。实际上,很少有人需要使用
%K
只有在需要动态确定字段名时才需要使用它。由于未捕获的异常“CKException”而终止应用程序,原因是:“比较表达式中的预期常量值:genderField1==genderField2”***第一次抛出调用堆栈:try self.genderField1”(并将genderField1和genderField2更改为实际字段名)
let predicate = NSPredicate(format: "(gender1 = \"male\" AND gender2 = \"male\") OR (gender1 = \"female\" AND gender2 = \"female\")")