Как написать предикат BOOL в Core Data?

89

У меня есть атрибут типа, BOOLи я хочу выполнить поиск всех управляемых объектов, в которых находится этот атрибут YES.

Для строковых атрибутов это просто. Я создаю такой предикат:

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

Но как мне это сделать, если у меня есть атрибут bool с именем selected и я хочу создать для него предикат? Могу я сделать что-нибудь подобное?

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

Или мне нужны другие спецификаторы формата и просто передать YES?

Гордый член
источник

Ответы:

101

Из Руководства по программированию предикатов :

Вы указываете и проверяете равенство логических значений, как показано в следующих примерах:

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

Вы также можете ознакомиться с синтаксисом строки формата предиката .

Альбертамг
источник
@inorganik Я прочитал аналогичное требование здесь . Я не знаю, в чем причина этого, но, наверное, это должно сработать, и это работает для меня.
albertamg
@inorganik Я тоже пробовал, и это сработало («мне подходит»). Не знаю, что вы пробовали. Мне это интересно. Если хотите, поделитесь ссылкой на тестовый пример, чтобы я мог попробовать тот же код.
albertamg
Я перепроверил, и это сработало ... так что я ошибался. Что-то еще должно было стать причиной провала моего дела. В любом случае +1 к вашему ответу
inorganik
@inorganik, понятно. Если вы узнаете, что привело к провалу вашего дела, я хотел бы знать. Спасибо за +1! :)
albertamg 05
93

Swift 4.0

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))
Виктор Кучера
источник
Есть ли способ получить все объекты для bool, равного нулю ?? Или это всегда должно быть правдой или ложью ??
Apoorv Mote
@ApoorvMote, начиная с Xcode 9.4, Swift 4, да: если вы используете обычное значение Bool в предикате, элементы со nilзначениями атрибутов будут найдены. Например, установите для атрибута значение nil(мы скажем, что вы назвали его так, boolAttributeкак показано в этом ответе). Затем создать предикат: let predicate = NSPredicate(format: "boolAttribute == %@", boolValue). Примечание: boolValueдолжно быть равно trueили false, НЕ NSNumber(value: boolValue). Полученный предикат будет: boolAttribute == nil. Этот предикат будет возвращать какие - либо объекты , где boolAttributeявляется nil. Может не работать вечно ...
Leanne
Это работает. Вы также можете просто использовать формат «boolAttribute == 1».
Золтан Винклер
35

Не конвертируйте в NSNumber и не используйте двойной "=="

Более подходит для Swift> = 4:

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

Примечание. "True" в этом примере - это Bool (Struct).

Алегелос
источник
2
должен быть новый принятый ответ. Ради всего
святого,
16

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
В качестве альтернативы:NSPredicate(format: "boolAttribute == %@", true as NSNumber)
Martin R
3

Swift 4

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

Swift 3

request.predicate = NSPredicate(format: "field = %@", value as CVarArg)
SoftDesigner
источник
2
Это вызывает сбой с Xcode 9.3 и Swift 4.1. Вместо этого используйте этот метод .
Тамаш Сенгель
2

Swift 3.0 внес в это небольшое изменение:

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(booleanLiteral: true))
Марио Хендрикс
источник