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?

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 .


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

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)


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)


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)

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))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.