比较两个键的谓词
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\")")
我正在尝试编写一个谓词来比较云工具包数据库中的两个键。我能找到的所有文档只允许您将一个键与一个设定值进行比较。有没有办法在 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\")")