我有BOOL
类型的属性,我想搜索此属性为YES
的所有托管对象。
对于字符串属性,它很简单。我创建了一个这样的谓词:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"userName = %@", userName];
但是,如果我有一个名为 selected 的bool属性,我该怎么做呢?我想为此做一个谓词?我可以这样做吗?
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"selected = %@", yesNumber];
或者我是否需要其他格式说明符,只需传递YES
?
答案 0 :(得分:98)
来自Predicate Programming Guide:
指定并测试布尔值的相等性,如以下示例所示:
NSPredicate *newPredicate = [NSPredicate predicateWithFormat:@"anAttribute == %@", [NSNumber numberWithBool:aBool]];
NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == YES"];
答案 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)