Jak napisać predykat BOOL w danych podstawowych?

89

Mam atrybut typu BOOLi 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?

Dumny członek
źródło

Odpowiedzi:

101

Z przewodnika programowania predykatów :

Należy określić i przetestować równość wartości logicznych, jak zilustrowano w poniższych przykładach:

NSPredicate *newPredicate = [NSPredicate predicateWithFormat:@"anAttribute == %@", [NSNumber numberWithBool:aBool]];
NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == YES"];

Możesz również sprawdzić składnię ciągu formatu predykatu .

albertamg
źródło
@inorganik Czytałem podobne roszczenie tutaj . Nie wiem, jaki jest tego powód, ale afaik to powinno działać i dla mnie działa.
albertamg
@inorganik Też próbowałem i zadziałało ("to dla mnie działa"). Nie wiem, czego próbowałeś. Ciekawi mnie to. Jeśli chcesz, udostępnij link do przypadku testowego, abym mógł wypróbować dokładnie ten sam kod.
albertamg
Przetestowałem ponownie i zadziałało ... więc się myliłem. Coś innego musiało spowodować niepowodzenie mojej sprawy. Tak czy inaczej +1 w Twojej odpowiedzi
nieorganik
@inorganik och, rozumiem. Jeśli dowiesz się, co spowodowało niepowodzenie Twojej sprawy, chciałbym to wiedzieć. Dzięki za +1! :)
albertamg
93

Swift 4.0

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))
Viktor Kucera
źródło
Czy istnieje sposób na pobranie wszystkich obiektów dla bool równa się nil? A może zawsze musi to być prawda lub fałsz?
Apoorv Mote
@ApoorvMote, od Xcode 9.4, Swift 4, tak: jeśli użyjesz zwykłej wartości Bool w predykacie, nilzostaną znalezione elementy z wartościami atrybutów. Na przykład ustaw wartość atrybutu na nil(powiemy, że nazwałeś go boolAttributetak , jak pokazano w tej odpowiedzi). Następnie utworzyć predykat: let predicate = NSPredicate(format: "boolAttribute == %@", boolValue). Uwaga: boolValuepowinno być równe truelub falseNIE NSNumber(value: boolValue). Powstały orzecznik będą: boolAttribute == nil. Że orzeczenie będzie powrócić żadnych obiektów, gdzie boolAttributejest nil. Może nie działać wiecznie ...
leanne
To działa. Możesz też po prostu użyć formatu „boolAttribute == 1”.
Zoltan Vinkler
35

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)

alegelos
źródło
2
powinna być nową zaakceptowaną odpowiedzią. na miłość boską jest rok 2020
RyanM
16

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 dla ExpressibleBy...Literalinicjatora użycia bezpośrednio:

Naruszenie protokołu kompilatora: inicjatory zadeklarowane w protokołach kompilatora, takie jak, ExpressibleByArrayLiteralnie powinny być wywoływane bezpośrednio. (compiler_protocol_init)

Lukas Kukacka
źródło
3
Alternatywnie:NSPredicate(format: "boolAttribute == %@", true as NSNumber)
Martin R
3

Szybki 4

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

Szybki 3

request.predicate = NSPredicate(format: "field = %@", value as CVarArg)
SoftDesigner
źródło
2
Powoduje to awarię z Xcode 9.3 i Swift 4.1. Zamiast tego użyj tej metody .
Tamás Sengel
2

Swift 3.0 dokonał niewielkiej zmiany w tym:

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(booleanLiteral: true))
Mario Hendricks
źródło