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

Pro*_*ber 79 iphone predicate core-data ipad ios

我有一个类型的属性,BOOL我想搜索此属性所在的所有托管对象YES.

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

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"userName = %@", userName];
Run Code Online (Sandbox Code Playgroud)

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

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"selected = %@", yesNumber];
Run Code Online (Sandbox Code Playgroud)

或者我是否需要其他格式说明符并且只是通过YES

alb*_*amg 99

来自谓词编程指南:

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

NSPredicate *newPredicate = [NSPredicate predicateWithFormat:@"anAttribute == %@", [NSNumber numberWithBool:aBool]];
NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == YES"];
Run Code Online (Sandbox Code Playgroud)

您还可以查看谓词格式字符串语法.


Vik*_*era 80

Swift 4.0

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))
Run Code Online (Sandbox Code Playgroud)


Luk*_*cka 16

斯威夫特3

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))
Run Code Online (Sandbox Code Playgroud)

在Swift 3中你应该使用NSNumber(value: true).

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

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

  • 或者:`NSPredicate(格式:"boolAttribute ==%@",真如NSNumber)` (3认同)

ale*_*los 8

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

更适合Swift> = 4:

NSPredicate(format: "boolAttribute = %d", true)
Run Code Online (Sandbox Code Playgroud)

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

  • 应该是新接受的答案。看在皮特的份上,现在是 2020 年了 (4认同)

Sof*_*ner 5

雨燕4

request.predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))
Run Code Online (Sandbox Code Playgroud)

雨燕3

request.predicate = NSPredicate(format: "field = %@", value as CVarArg)
Run Code Online (Sandbox Code Playgroud)

  • 这会导致 Xcode 9.3 和 Swift 4.1 崩溃。请改用[此方法](/sf/answers/2424212171/)。 (2认同)