Bagaimana cara menulis predikat BOOL di Core Data?

89

Saya memiliki atribut tipe BOOLdan saya ingin melakukan pencarian untuk semua objek yang dikelola di mana atribut ini berada YES.

Untuk atribut string itu sangat mudah. Saya membuat predikat seperti ini:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"userName = %@", userName];

Tetapi bagaimana saya melakukan ini, jika saya memiliki atribut bool yang disebut selected dan saya ingin membuat predikat untuk ini? Bisakah saya melakukan sesuatu seperti ini?

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"selected = %@", yesNumber];

Atau apakah saya memerlukan penentu format lain dan lulus begitu saja YES?

Anggota Bangga
sumber

Jawaban:

102

Dari Panduan Pemrograman Predikat :

Anda menentukan dan menguji kesetaraan nilai Boolean seperti yang diilustrasikan dalam contoh berikut:

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

Anda juga dapat memeriksa Sintaks String Format Predikat .

albertamg.dll
sumber
@inorganik Saya telah membaca klaim serupa di sini . Saya tidak tahu apa alasannya tetapi afaik itu harus berhasil dan itu untuk saya.
albertamg
@inorganik Saya juga mencobanya dan berhasil ("cocok untuk saya"). Saya tidak tahu apa yang Anda coba. Saya penasaran tentang itu. Jika mau, bagikan link ke kasus uji agar saya dapat mencoba kode yang sama persis.
albertamg
Saya menguji ulang dan berhasil ... jadi saya salah. Sesuatu pasti telah menyebabkan kasus saya gagal. Salah satu cara memberi +1 pada jawaban Anda
inorganik
@ anorganik oh begitu. Jika Anda mencari tahu apa yang menyebabkan kasus Anda gagal, saya ingin tahu. Terima kasih atas +1! :)
albertamg
94

Swift 4.0.0

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))
Viktor Kucera
sumber
Apakah ada cara untuk mengambil semua objek karena bool sama dengan nil ?? Atau apakah selalu harus benar atau salah ??
Apoorv Mote
@ApoorvMote, mulai Xcode 9.4, Swift 4, ya: jika Anda menggunakan nilai Bool reguler dalam predikat, item dengan nilnilai atribut akan ditemukan. Misalnya, setel nilai atribut ke nil(kami akan mengatakan Anda menyebutnya boolAttributeseperti yang ditunjukkan dalam jawaban ini). Kemudian, buat predikat Anda: let predicate = NSPredicate(format: "boolAttribute == %@", boolValue). Catatan: boolValueharus sama trueatau false, TIDAK NSNumber(value: boolValue). Predikat yang dihasilkan akan: boolAttribute == nil. Predikat itu akan mengembalikan objek mana boolAttributepun nil. Mungkin tidak akan bekerja selamanya ...
leanne
Ini berhasil. Anda juga dapat menggunakan format "boolAttribute == 1".
Zoltan Vinkler
39

Jangan mengonversi ke NSNumber, atau gunakan ganda "=="

Lebih sesuai untuk Swift> = 4:

NSPredicate(format: "boolAttribute = %d", true)

Catatan: "true" dalam contoh ini adalah Bool (a Struct)

alegelos.dll
sumber
4
harus menjadi jawaban baru yang diterima. Demi pete tahun 2020
RyanM
16

Cepat 3

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

Di Swift 3 Anda harus menggunakan NSNumber(value: true) .

Penggunaan NSNumber(booleanLiteral: true)dan secara umum inisialisasi literal secara langsung tidak dianjurkan dan misalnya SwiftLint (v. 0.16.1) akan menghasilkan peringatan untuk ExpressibleBy...Literalpenginisialisasi penggunaan secara langsung:

Compiler Protocol Init Violation: Penginisialisasi yang dideklarasikan dalam protokol compiler seperti ExpressibleByArrayLiteraltidak boleh dipanggil secara langsung. (compiler_protocol_init)

Lukas Kukacka
sumber
3
Atau:NSPredicate(format: "boolAttribute == %@", true as NSNumber)
Martin R
3

Cepat 4

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

Cepat 3

request.predicate = NSPredicate(format: "field = %@", value as CVarArg)
SoftDesigner
sumber
2
Ini menyebabkan crash pada Xcode 9.3 dan Swift 4.1. Gunakan metode ini sebagai gantinya.
Tamás Sengel
2

Swift 3.0 telah membuat sedikit perubahan pada ini:

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