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

问题描述 投票:72回答:6

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

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

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

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

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

或者我需要其他格式说明符,只需通过YES

iphone ios ipad core-data predicate
6个回答
98
投票

来自Predicate Programming Guide

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

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

您还可以查看Predicate Format String Syntax


78
投票

Swift 4.0

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

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)


4
投票

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

更适合Swift 4:

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

注意:此示例中的“true”是Bool(一个Struct)


3
投票

斯威夫特4

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

斯威夫特3

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

2
投票

Swift 3.0对此略有改动:

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(booleanLiteral: true))
© www.soinside.com 2019 - 2024. All rights reserved.