web-dev-qa-db-fra.com

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

J'ai un attribut de type BOOL et je souhaite effectuer une recherche sur tous les objets gérés pour lesquels cet attribut est YES.

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

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

Mais comment faire cela si j'ai un attribut bool appelé selected et que je veux créer un prédicat pour cela? Puis-je 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?

70
Proud Member

De 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 formatage Predicate .

97
albertamg

Swift 4.0

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

Swift 3

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

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

L'utilisation de 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'utilisation de ExpressibleBy...Literal initializer directement:

Violation d'initialisation de protocole de compilateur: Les initialiseurs déclarés dans des protocoles de compilateur tels que ExpressibleByArrayLiteral ne doivent pas être appelés directement. (compiler_protocol_init)

15
Lukas Kukacka

Swift 3.0 a légèrement modifié ceci: 

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

Ne convertissez pas en NSNumber, ni double "=="

Plus approprié pour Swift 4:

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

Remarque: "true" dans cet exemple est un booléen (une structure)

1
alegelos

Swift 4

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

Swift 3

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