จะเขียนเพรดิเคต BOOL ใน Core Data ได้อย่างไร?


89

ฉันมีแอตทริบิวต์ของพิมพ์และฉันต้องการที่จะดำเนินการค้นหาสำหรับวัตถุที่จัดการทั้งหมดที่แอตทริบิวต์นี้คือBOOLYES

สำหรับแอตทริบิวต์สตริงนั้นตรงไปตรงมา ฉันสร้างเพรดิเคตดังนี้:

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

แต่ฉันจะทำสิ่งนี้ได้อย่างไรถ้าฉันมีแอตทริบิวต์บูลที่เรียกว่าselectedและฉันต้องการสร้างเพรดิเคตสำหรับสิ่งนี้ ฉันจะทำอะไรแบบนี้ได้ไหม

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

หรือฉันต้องการตัวระบุรูปแบบอื่น ๆ และเพียงแค่ผ่านYES?

คำตอบ:


102

จากPredicate Programming Guide :

คุณระบุและทดสอบความเท่าเทียมกันของค่าบูลีนตามที่แสดงในตัวอย่างต่อไปนี้:

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

คุณยังสามารถตรวจสอบไวยากรณ์สตริงรูปแบบเพรดิเคต


@inorganik ฉันได้อ่านข้อเรียกร้องที่คล้ายกันที่นี่ ฉันไม่รู้ว่าอะไรคือเหตุผลสำหรับสิ่งนี้ แต่ afaik มันควรจะใช้ได้และมันก็เหมาะกับฉัน
albertamg

@inorganik ฉันลองแล้วและมันได้ผล ("มันทำเพื่อฉัน") ฉันไม่รู้ว่าคุณพยายามอะไร ฉันอยากรู้เกี่ยวกับมัน ถ้าคุณต้องการให้แชร์ลิงก์ไปยังกรณีทดสอบเพื่อให้ฉันสามารถลองใช้รหัสเดียวกันได้
albertamg

ฉันทดสอบอีกครั้งและได้ผล ... ดังนั้นฉันจึงคิดผิด อย่างอื่นต้องทำให้กรณีของฉันล้มเหลว ไม่ว่าจะด้วยวิธีใดก็ +1 กับคำตอบของคุณ
inorganik

@inorganik โอ้ฉันเห็น หากคุณพบว่าอะไรทำให้กรณีของคุณล้มเหลวฉันอยากจะรู้ ขอบคุณสำหรับ +1! :)
albertamg

94

Swift 4.0

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

มีวิธีใดบ้างที่จะดึงวัตถุทั้งหมดสำหรับบูลเท่ากับศูนย์ ?? หรือมันต้องเป็นจริงหรือเท็จเสมอไป ??
Apoorv Mote

@ApoorvMote ณ Xcode 9.4, Swift 4 ใช่: หากคุณใช้ค่า Bool ปกติในเพรดิเคnilตจะพบรายการที่มีค่าแอตทริบิวต์ ตัวอย่างเช่นตั้งค่าแอตทริบิวต์เป็นnil(เราจะบอกว่าคุณเรียกboolAttributeตามที่แสดงในคำตอบนี้) จากนั้นสร้างเพรดิเคตของคุณ: let predicate = NSPredicate(format: "boolAttribute == %@", boolValue). หมายเหตุ: boolValueควรจะเท่ากับtrueหรือไม่ใช่false NSNumber(value: boolValue)boolAttribute == nilคำกริยาที่เกิดจะเป็น: กริยาที่จะกลับวัตถุใด ๆ ที่เป็นboolAttribute nilอาจใช้ไม่ได้ตลอดไป ...
leanne

นี่คือการทำงาน คุณสามารถใช้รูปแบบ "boolAttribute == 1" ได้เช่นกัน
Zoltan Vinkler

39

อย่าแปลงเป็น NSNumber หรือใช้ double "=="

เหมาะสมกว่าสำหรับ Swift> = 4:

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

หมายเหตุ: "true" ในตัวอย่างนี้คือ Bool (โครงสร้าง)


4
ควรเป็นคำตอบใหม่ที่ได้รับการยอมรับ เป็นปี 2020 เพื่อเห็นแก่พีท
RyanM

16

สวิฟต์ 3

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

ในสวิฟท์ 3 NSNumber(value: true)คุณควรใช้

การใช้NSNumber(booleanLiteral: true)และโดยทั่วไปแล้วตัวเริ่มต้นตามตัวอักษรใด ๆ โดยตรงจะไม่แนะนำและตัวอย่างเช่นSwiftLint (v. 0.16.1) จะสร้างคำเตือนสำหรับผู้ExpressibleBy...Literalเริ่มต้นการใช้งานโดยตรง:

Compiler Protocol Init Violation: initializers ที่ประกาศในโปรโตคอลคอมไพเลอร์เช่นExpressibleByArrayLiteralไม่ควรถูกเรียกโดยตรง (คอมไพเลอร์ _protocol_init)


3
อีกทางเลือกหนึ่ง:NSPredicate(format: "boolAttribute == %@", true as NSNumber)
Martin R

3

สวิฟต์ 4

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

สวิฟต์ 3

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

2
สิ่งนี้ทำให้เกิดข้อขัดข้องกับ Xcode 9.3 และ Swift 4.1 ใช้วิธีนี้แทน
Tamás Sengel

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.