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

时间:2011-05-29 17:08:19

标签: iphone ios ipad core-data predicate

我有BOOL类型的属性,我想搜索此属性为YES的所有托管对象。

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

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

但是,如果我有一个名为 selected 的bool属性,我该怎么做呢?我想为此做一个谓词?我可以这样做吗?

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

或者我是否需要其他格式说明符,只需传递YES

7 个答案:

答案 0 :(得分:98)

来自Predicate Programming Guide

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

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

您还可以查看Predicate Format String Syntax

答案 1 :(得分:74)

Swift 4.0

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

答案 2 :(得分:15)

Swift 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 :(得分:2)

Swift 3.0 对此略有改动:

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

答案 4 :(得分:2)

Swift 4

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

Swift 3

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

答案 5 :(得分:2)

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

更适合Swift 4:

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

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

答案 6 :(得分:0)

如果您不想在格式中对属性名称进行硬编码,您可以将 #keyPath 与类似的内容一起使用,

let samplePredicate = NSPredicate(format: "%K != %d", #keyPath(Foo.attr), true)