Ich habe ein Attribut vom Typ BOOL
und möchte eine Suche nach allen verwalteten Objekten durchführen, bei denen dieses Attribut YES
ist.
Für Zeichenfolgenattribute ist das unkompliziert. Ich erstelle so ein Prädikat:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"userName = %@", userName];
Aber wie mache ich das, wenn ich ein bool-Attribut namens selected habe und ich ein Prädikat dafür machen möchte? Könnte ich einfach so etwas tun?
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"selected = %@", yesNumber];
Oder brauche ich andere Formatbezeichner und YES
übergeben?
Von Predicate-Programmierhandbuch :
Sie geben an und testen auf Gleichheit von booleschen Werten, wie in den folgenden Beispielen veranschaulicht:
NSPredicate *newPredicate = [NSPredicate predicateWithFormat:@"anAttribute == %@", [NSNumber numberWithBool:aBool]];
NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == YES"];
Sie können auch die Predicate-Formatstringsyntax auschecken.
Swift 4.0
let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))
Swift 3
let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))
In Swift 3 sollten Sie NSNumber(value: true)
verwenden.
Die Verwendung von NSNumber(booleanLiteral: true)
und im Allgemeinen jeglichem literalen Initialisierer wird direkt davon abgeraten, und zum Beispiel SwiftLint (v. 0.16.1) wird eine Warnung für den ExpressibleBy...Literal
-Initialisierer direkt generiert:
Compiler Protocol Init Violation: Die in Compilerprotokollen wie
ExpressibleByArrayLiteral
deklarierten Initialisierer sollten nicht direkt aufgerufen werden. (compiler_protocol_init)
Swift 3.0 hat daran eine leichte Änderung vorgenommen:
let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(booleanLiteral: true))
Nicht in NSNumber konvertieren, noch double "==" verwenden
Besser geeignet für Swift 4:
NSPredicate(format: "boolAttribute = %d", true)
Hinweis: "true" in diesem Beispiel ist ein Bool (ein Struct)
Swift 4
request.predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))
Swift 3
request.predicate = NSPredicate(format: "field = %@", value as CVarArg)