Як написати предикат BOOL у Core Data?


89

У мене є атрибут типу, BOOLі я хочу виконати пошук усіх керованих об’єктів, де знаходиться цей атрибут YES.

Для атрибутів рядків це просто. Я створюю такий предикат:

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

Але як це зробити, якщо у мене є атрибут bool, який називається вибраним, і я хочу зробити для цього предикат? Чи можу я просто зробити щось подібне?

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

93

Свіфт 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 (структура)


2
повинна бути нова прийнята відповідь. це рік заради
Піта

16

Стрімкий 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

Стрімкий 4

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

Стрімкий 3

request.predicate = NSPredicate(format: "field = %@", value as CVarArg)

2
Це спричиняє збій із Xcode 9.3 та Swift 4.1. Замість цього використовуйте цей метод .
Tamás Sengel

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.