Как написать предикат BOOL в Core Data?
У меня есть атрибут типа BOOL
, и я хочу выполнить поиск для всех управляемых объектов, где этот атрибут YES
.
Для строковых атрибутов это просто. Я создаю предикат следующим образом:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"userName = %@", userName];
Но как мне это сделать, если у меня есть атрибут bool, который называется selected, и я хочу сделать предикат для этого? Могу ли я просто сделать что-то вроде этого?
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"selected = %@", yesNumber];
Или мне нужны другие спецификаторы формата и просто передайте YES
?
Ответы
Ответ 1
Из Руководство по программированию предикатов:
Вы указываете и проверяете равенство логических значений, как показано в следующих примерах:
NSPredicate *newPredicate = [NSPredicate predicateWithFormat:@"anAttribute == %@", [NSNumber numberWithBool:aBool]];
NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == YES"];
Вы также можете проверить Синтаксис строки предиката формата.
Ответ 2
Swift 4.0
let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))
Ответ 3
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)
Ответ 4
Не конвертируйте в NSNumber и не используйте двойные "=="
Подходит для Swift> = 4:
NSPredicate(format: "boolAttribute = %d", true)
Примечание. В данном примере "true" - это Bool (структура)
Ответ 5
Swift 4
request.predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))
Swift 3
request.predicate = NSPredicate(format: "field = %@", value as CVarArg)
Ответ 6
Swift 3.0 сделал небольшое изменение:
let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(booleanLiteral: true))