ความแตกต่างระหว่าง setObject: forKey: และ setValue: forKey: ใน NSMutableDictionary อย่างไร


153

เมื่อดูเอกสารฉันแทบจะไม่เห็นความแตกต่างใหญ่เลย ทั้ง "value" และ "object" เป็นประเภท idดังนั้นอาจเป็นวัตถุใดก็ได้ คีย์คือสตริงหนึ่งครั้งและในอีกกรณีหนึ่งคือรหัส หนึ่งในนั้นดูเหมือนว่าจะรักษาวัตถุไว้และอีกอันหนึ่งก็ไม่ทำเช่นนั้น มีอะไรอีกบ้าง? สิ่งใดเป็นสิ่งที่กรณี?


คำตอบ:


163

setValue:forKey:เป็นส่วนหนึ่งของโปรโตคอลNSKeyValueCodingซึ่งช่วยให้คุณสามารถเข้าถึงคุณสมบัติของวัตถุจากไลค์ของเครื่องมือสร้างส่วนต่อประสาน setValue:forKey:จะดำเนินการในชั้นเรียนอื่น ๆ NSDictionaryกว่า

setObject:forKey:เป็นNSMutableDictionary'sเหตุผลที่มีอยู่ ลายเซ็นของมันเกิดขึ้นค่อนข้างคล้ายกับ setValue: forKey :, แต่จะเป็นแบบทั่วไปมากกว่า (เช่นชนิดของคีย์ใด ๆ ) มันค่อนข้างบังเอิญว่าลายเซ็นนั้นคล้ายคลึงกันมาก

สิ่งที่เพิ่มความสับสนคือการใช้ NSMutableDictionary setValue:forKey:เทียบเท่ากับsetObject:forKey:ในกรณีส่วนใหญ่ ในคลาสอื่นให้setValue:forKey:เปลี่ยนตัวแปรสมาชิก ในNSMutableDictionaryมันจะเปลี่ยนรายการพจนานุกรมเว้นแต่คุณจะใส่คำนำหน้าคีย์ด้วยอักขระ '@' ซึ่งในกรณีนี้จะแก้ไขตัวแปรสมาชิก

ดังนั้นในการสรุปการใช้setObject:forKey:เมื่อคุณจำเป็นต้องทำงานด้วยปุ่มพจนานุกรมและค่านิยมและsetValue:forKey:ในกรณีที่หายากที่คุณต้องการที่จะแก้ไขปัญหาKVP

แก้ไข: และโอ้ดูเหมือนว่ามีการถามและตอบก่อนหน้านี้: ความแตกต่างระหว่าง objectForKey และ valueForKey?


คำถามนั้นไม่เหมือนกันทุกประการ มันเป็นเรื่องเกี่ยวกับวิธีทะเยอทะยานในขณะที่คำถามนี้เป็นเรื่องเกี่ยวกับวิธีการตั้งค่า
user102008

1
คุณหมายถึงอะไร "ใน NSMutableDictionary มันจะเปลี่ยนรายการพจนานุกรมเว้นแต่ว่าคุณจะใส่คีย์ด้วยอักขระ '@' ซึ่งในกรณีนี้มันจะปรับเปลี่ยนตัวแปรสมาชิก" สมาชิกตัวแปรอะไร นอกจากนี้ยังอาจจะสามารถแสดงความคิดเห็นในstackoverflow.com/questions/5755917 ? ขอบคุณ
ปีเตอร์ibrtibraný

เพียงเพื่อความสมบูรณ์ setObject: forKey จะเพิ่ม (ยกเว้น) ถ้าวัตถุเป็นศูนย์ จะ setValue: forKey ทำงานเหมือนเดิมหรือจะลบวัตถุที่มีอยู่ออกจากพจนานุกรมเมื่อตั้งค่าศูนย์สำหรับคีย์?
Motti Shneor

คำตอบที่ดี จริงๆ. เพื่อความสมบูรณ์แม้ว่ามันจะดีที่จะพูดถึงว่า (ใน NSMutableDictionary อย่างน้อย) setValue: forKey: ยอมรับค่าศูนย์และลบรายการ - ในขณะที่ setObject: forKey: จะโยนข้อยกเว้นและความผิดพลาดเมื่อส่งค่าศูนย์
Motti Shneor

83

ข้อแตกต่างก็คือถ้าคุณให้ค่าศูนย์กับsetValue:forKey:มันจะลบคีย์จากพจนานุกรมถ้ามันมีอยู่มิฉะนั้นจะไม่ทำอะไรเลย แต่ถ้าคุณให้ค่าศูนย์ไปsetObject:forKey:มันจะยกข้อยกเว้นขึ้นมา


10
มันมีประโยชน์มากที่จะรู้ ฉันได้เขียนหมวดหมู่ของตัวเองใน NSMutableDictionary เพื่อทำสิ่งนี้ให้สำเร็จ! ขอบคุณ
Arman

2
แตกต่างก็คือมีวัตถุประสงค์-C subscripting คุณสามารถเขียนเพื่อสนับสนุนการลบที่สำคัญถ้าค่าเป็นdic[key] = value; nilการห้อยเป็นวิธีที่ดีกว่าsetValue:forKey:การทำสิ่งนี้ให้สำเร็จ
Cœur

9

-setValue:forKey:เพียงแค่ส่ง-setObject:forKey:ไปยังผู้รับเว้นแต่ค่าเป็นซึ่งในกรณีส่งnil-removeObjectForKey

ง่ายตาย


โอ้คุณพูดถูก ขอโทษด้วยกับเรื่องนั้น. มีการบันทึกไว้ที่นี่: developer.apple.com/reference/foundation/nsmutabledictionary/…
Eddie

4

anObject - ค่าสำหรับคีย์ NSDictionaryวัตถุที่ได้รับข้อความรักษาก่อนที่จะถูกเพิ่มลงใน ค่านี้ต้องไม่เป็นศูนย์

aKey - กุญแจสำคัญสำหรับค่า คีย์ถูกคัดลอก (ใช้copyWithZone:; คีย์ต้องสอดคล้องกับNSCopyingโปรโตคอล) กุญแจจะต้องไม่เป็นศูนย์

value - ค่าสำหรับคีย์

กุญแจ - กุญแจสำคัญสำหรับค่า โปรดทราบว่าเมื่อใช้การเข้ารหัสคีย์ - ค่าคีย์จะต้องเป็นสตริง (ดู "พื้นฐานการเข้ารหัสคีย์ - ค่า")


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