Как написать предикат 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))