Ios 比较两个键的谓词
我试图编写一个谓词来比较云工具包数据库中的两个键。我能找到的所有文档只允许您将一个键与一个设定值进行比较。有没有办法用swift写一个谓词来比较两个键 我能想到的最接近的方法是: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
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\")")