Как написать предикат BOOL в Core Data? - PullRequest
76 голосов
/ 29 мая 2011

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

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

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

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

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

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

Ответы [ 6 ]

98 голосов
/ 29 мая 2011

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

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

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

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

77 голосов
/ 06 января 2016

Swift 4.0

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))
15 голосов
/ 21 марта 2017

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 голосов
/ 01 апреля 2019

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

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

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

Примечание: «true» в этом примере - это Bool (структура)

2 голосов
/ 08 декабря 2017

Swift 4

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

Swift 3

request.predicate = NSPredicate(format: "field = %@", value as CVarArg)
2 голосов
/ 24 сентября 2016

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

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(booleanLiteral: true))
...