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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.