webentwicklung-frage-antwort-db.com.de

Wie schreibe ich ein BOOL-Prädikat in Core Data?

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?

70
Proud Member

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.

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))

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)

15
Lukas Kukacka

Swift 3.0 hat daran eine leichte Änderung vorgenommen: 

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

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)

1
alegelos

Swift 4

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

Swift 3

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