Comment écrire un prédicat BOOL dans Core Data?

89

J'ai un attribut de type BOOLet je souhaite effectuer une recherche pour tous les objets gérés où se trouve cet attribut YES.

Pour les attributs de chaîne, c'est simple. Je crée un prédicat comme celui-ci:

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

Mais comment faire cela, si j'ai un attribut booléen appelé selected et que je veux créer un prédicat pour cela? Puis-je simplement faire quelque chose comme ça?

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

Ou ai-je besoin d'autres spécificateurs de format et juste passer YES?

Membre fier
la source

Réponses:

101

À partir du guide de programmation des prédicats :

Vous spécifiez et testez l'égalité des valeurs booléennes comme illustré dans les exemples suivants:

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

Vous pouvez également consulter la syntaxe de chaîne de format de prédicat .

albertamg
la source
@inorganik J'ai lu une affirmation similaire ici . Je ne sais pas quelle est la raison de cela, mais je pense que cela devrait fonctionner et cela fonctionne pour moi.
albertamg
@inorganik Je l'ai aussi essayé et ça a marché ("ça fait pour moi"). Je ne sais pas ce que tu as essayé. Je suis curieux de savoir. Si vous le souhaitez, partagez un lien vers un cas de test afin que je puisse essayer exactement le même code.
albertamg
J'ai retesté et ça a marché ... alors je me suis trompé. Quelque chose d'autre a dû faire échouer mon dossier. De toute façon +1 sur votre réponse
inorganik
@inorganik oh je vois. Si vous découvrez ce qui a fait échouer votre dossier, j'aimerais le savoir. Merci pour le +1! :)
albertamg
93

Swift 4.0

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))
Viktor Kucera
la source
Existe-t-il un moyen de récupérer tous les objets pour booléen est égal à nil ?? Ou faut-il toujours que ce soit vrai ou faux?
Apoorv Mote
@ApoorvMote, à partir de Xcode 9.4, Swift 4, oui: si vous utilisez une valeur Bool standard dans le prédicat, les éléments avec des nilvaleurs d'attribut seront trouvés. Par exemple, définissez la valeur d'un attribut sur nil(nous dirons que vous l'avez appelé boolAttributecomme indiqué dans cette réponse). Ensuite, créez votre prédicat: let predicate = NSPredicate(format: "boolAttribute == %@", boolValue). Remarque: boolValuedoit être égal à trueou false, PAS NSNumber(value: boolValue). Le prédicat résultant sera: boolAttribute == nil. Ce prédicat va retourner tous les objets où boolAttributeest nil. Might not work forever ...
leanne
Cela fonctionne. Vous pouvez également utiliser simplement le format "boolAttribute == 1".
Zoltan Vinkler
35

Ne pas convertir en NSNumber, ni utiliser le double "=="

Plus approprié pour Swift> = 4:

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

Remarque: "true" dans cet exemple est un Bool (un Struct)

alegelos
la source
2
devrait être une nouvelle réponse acceptée. c'est 2020 pour l'amour de
Pete
16

Swift 3

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

Dans Swift 3, vous devez utiliser NSNumber(value: true).

L'utilisation NSNumber(booleanLiteral: true)et en général de tout initialiseur littéral directement est déconseillée et par exemple SwiftLint (v. 0.16.1) générera un avertissement pour l' ExpressibleBy...Literalinitialiseur d' utilisation directement:

Violation d'initialisation du protocole du compilateur: les initialiseurs déclarés dans les protocoles du compilateur ExpressibleByArrayLiteralne doivent pas être appelés directement. (compilateur_protocole_init)

Lukas Kukacka
la source
3
Alternativement: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
la source
2
Cela provoque un crash avec Xcode 9.3 et Swift 4.1. Utilisez plutôt cette méthode .
Tamás Sengel
2

Swift 3.0 a apporté une légère modification à ceci:

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(booleanLiteral: true))
Mario Hendricks
la source