如何在Core Data中编写BOOL谓词?


89

我有一个type属性,BOOL我想搜索该属性为的所有托管对象YES

对于字符串属性,它很简单。我创建这样的谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"userName = %@", userName];

但我怎么做到这一点,如果我有一个叫布尔属性选择,我想为这个断言?我可以做这样的事情吗?

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"selected = %@", yesNumber];

还是我需要其他格式说明符并通过YES

Answers:


101

谓词编程指南

您指定并测试布尔值的相等性,如以下示例所示:

NSPredicate *newPredicate = [NSPredicate predicateWithFormat:@"anAttribute == %@", [NSNumber numberWithBool:aBool]];
NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == YES"];

您还可以检出谓词格式字符串语法


@inorganik我在这里读过类似的声明。我不知道这是什么原因,但是afaik它应该起作用并且对我有用。
albertamg,2015年

@inorganik我也尝试了它,并且它起作用了(“对我有用”)。我不知道你尝试了什么 我对此很好奇。如果需要,请共享一个测试用例的链接,以便我可以尝试完全相同的代码。
albertamg,2015年

我进行了重新测试,并成功了...所以我错了。某些其他原因可能导致我的案件失败。无论哪种方式,您的答案都是+1
inorganik

@inorganik哦,我明白了。如果您找出导致您的案件失败的原因,我很想知道。感谢您的+1!:)
albertamg 2015年

93

迅捷4.0

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))

有什么方法可以获取所有对象,因为bool等于nil?还是总是必须为true或false?
Apoorv Mote

@ApoorvMote,自Xcode 9.4,Swift 4起,是的:如果在谓词中使用常规的Bool值,nil则将找到具有属性值的项。例如,将属性的值设置为nilboolAttribute如您在此答案中所示,将其称为)。然后,创建您的谓词:let predicate = NSPredicate(format: "boolAttribute == %@", boolValue)注意:boolValue应等于truefalse,而不是NSNumber(value: boolValue)结果谓词为:boolAttribute == nil。该谓词返回boolAttributeis中的任何对象nil。可能永远无法工作...
leanne

这是可行的。您也可以简单地使用“ boolAttribute == 1”格式。
Zoltan Vinkler

34

不要转换为NSNumber,也不要使用双“ ==”

更适合Swift> = 4:

NSPredicate(format: "boolAttribute = %d", true)

注意:在此示例中,“ true”是布尔(结构)


2
应该是新接受的答案。
皮特

16

迅捷3

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))

在Swift 3中,您应该使用NSNumber(value: true)

NSNumber(booleanLiteral: true)不建议直接使用任何文字初始化程序,一般而言,不建议使用SwiftLint(v。0.16.1)生成使用ExpressibleBy...Literal初始化程序的警告:

违反编译器协议初始化:ExpressibleByArrayLiteral不应直接调用在编译器协议中声明的初始化器。(compiler_protocol_init)


3
或者:NSPredicate(format: "boolAttribute == %@", true as NSNumber)
Martin R

3

斯威夫特4

request.predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))

迅捷3

request.predicate = NSPredicate(format: "field = %@", value as CVarArg)

2
这会导致Xcode 9.3和Swift 4.1崩溃。请改用此方法
塔玛斯·森格尔'18

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.