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
?
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 .
Swift 4.0
let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))
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)
Swift 3.0 a légèrement modifié ceci:
let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(booleanLiteral: true))
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)
Swift 4
request.predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))
Swift 3
request.predicate = NSPredicate(format: "field = %@", value as CVarArg)