Mam atrybut typu BOOL
i chcę przeprowadzić wyszukiwanie dla wszystkich zarządzanych obiektów, w których znajduje się ten atrybut YES
.
W przypadku atrybutów łańcuchowych jest to proste. Tworzę predykat w ten sposób:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"userName = %@", userName];
Ale jak to zrobić, jeśli mam atrybut bool o nazwie selected i chcę utworzyć predykat dla tego? Czy mógłbym po prostu zrobić coś takiego?
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"selected = %@", yesNumber];
A może potrzebuję innych specyfikatorów formatu i po prostu je przekazać YES
?
Swift 4.0
let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))
źródło
nil
zostaną znalezione elementy z wartościami atrybutów. Na przykład ustaw wartość atrybutu nanil
(powiemy, że nazwałeś goboolAttribute
tak , jak pokazano w tej odpowiedzi). Następnie utworzyć predykat:let predicate = NSPredicate(format: "boolAttribute == %@", boolValue)
. Uwaga:boolValue
powinno być równetrue
lubfalse
NIENSNumber(value: boolValue)
. Powstały orzecznik będą:boolAttribute == nil
. Że orzeczenie będzie powrócić żadnych obiektów, gdzieboolAttribute
jestnil
. Może nie działać wiecznie ...Nie konwertuj na NSNumber ani nie używaj podwójnego "=="
Bardziej odpowiednie dla języka Swift> = 4:
NSPredicate(format: "boolAttribute = %d", true)
Uwaga: „prawda” w tym przykładzie to Bool (struktura)
źródło
Szybki 3
let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))
W Swift 3 powinieneś użyć
NSNumber(value: true)
.Używanie
NSNumber(booleanLiteral: true)
i generalnie bezpośredniego inicjatora dosłownego jest odradzane i na przykład SwiftLint (v. 0.16.1) wygeneruje ostrzeżenie dlaExpressibleBy...Literal
inicjatora użycia bezpośrednio:źródło
NSPredicate(format: "boolAttribute == %@", true as NSNumber)
Szybki 4
request.predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))
Szybki 3
request.predicate = NSPredicate(format: "field = %@", value as CVarArg)
źródło
Swift 3.0 dokonał niewielkiej zmiany w tym:
let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(booleanLiteral: true))
źródło