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

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

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

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

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

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

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


person Proud Member    schedule 29.05.2011    source источник


Ответы (7)


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

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

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

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

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

Swift 4.0

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))
person Viktor Kucera    schedule 06.01.2016
comment
Есть ли способ получить все объекты для bool, равного нулю ?? Или это всегда должно быть правдой или ложью ?? - person Apoorv Mote; 17.07.2016
comment
@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. Может не работать вечно ... - person leanne; 10.07.2018
comment
Это работает. Вы также можете просто использовать формат boolAttribute == 1. - person Zoltan Vinkler; 21.11.2018

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

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

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

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

person alegelos    schedule 01.04.2019
comment
должен быть новый принятый ответ. Ради всего святого, сейчас 2020 год - person RyanM; 07.02.2020
comment
У меня это не работает при использовании NSPredicate с Core Data. Работает только версия NSNumber (ответ @ Viktor). - person Clifton Labrum; 16.02.2021
comment
У меня это тоже не сработало. - person Ramakrishna; 07.03.2021

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)

person Lukas Kukacka    schedule 21.03.2017
comment
Или: NSPredicate(format: "boolAttribute == %@", true as NSNumber) - person Martin R; 15.05.2017

Swift 4

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

Swift 3

request.predicate = NSPredicate(format: "field = %@", value as CVarArg)
person SoftDesigner    schedule 08.12.2017
comment
Это вызывает сбой с Xcode 9.3 и Swift 4.1. Вместо этого используйте этот метод. - person Tamás Sengel; 04.04.2018

Swift 3.0 немного изменил это:

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(booleanLiteral: true))
person Mario Hendricks    schedule 24.09.2016

если вы не хотите жестко кодировать имя атрибута внутри формата, вы можете использовать #keyPath с чем-то вроде,

let samplePredicate = NSPredicate(format: "%K != %d", #keyPath(Foo.attr), true)

person Glass    schedule 11.07.2021