วิธีการเพิ่ม NSDictionary


93

ฉันใช้ a NSMutableArrayและตระหนักว่าการใช้พจนานุกรมนั้นง่ายกว่ามากสำหรับสิ่งที่ฉันพยายามจะบรรลุ

ฉันต้องการบันทึกคีย์เป็น a NSStringและค่าเป็นintในพจนานุกรม วิธีนี้ทำได้อย่างไร? ประการที่สองอะไรคือความแตกต่างระหว่างพจนานุกรมที่แปรเปลี่ยนได้กับพจนานุกรมปกติ?

คำตอบ:


199

แน่นอนพจนานุกรมสามารถเปลี่ยนแปลงได้เช่นคุณสามารถเพิ่มและลบวัตถุ ไม่เปลี่ยนรูปได้รับการแก้ไขเมื่อมันถูกสร้างขึ้น

สร้างและเพิ่ม:

NSMutableDictionary *dict = [[NSMutableDictionary alloc]initWithCapacity:10];
[dict setObject:[NSNumber numberWithInt:42] forKey:@"A cool number"];

และดึงข้อมูล:

int myNumber = [[dict objectForKey:@"A cool number"] intValue];

คุณต้องเริ่มต้นด้วยความจุหรือเป็นแบบไดนามิกได้หรือไม่?
muttley91

2
คุณไม่จำเป็นต้องระบุความจุเริ่มต้น แต่คุณอาจเห็นประสิทธิภาพที่เพิ่มขึ้นหากคุณทำ หากคุณทราบล่วงหน้าว่าจะมีกี่รายการให้ระบุตัวเลขนี้หรือค่าที่มากกว่าเล็กน้อย
Eiko

ขอ NSDictionary ไม่ใช่ NSMutableDictionary?
Ananta Prasad

35

โดยการตั้งค่าคุณจะใช้setValue:(id)value forKey:(id)keyวิธีNSMutableDictionaryวัตถุ:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setValue:[NSNumber numberWithInt:5] forKey:@"age"];

หรือใน Objective-C สมัยใหม่:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
dict[@"age"] = @5;

ความแตกต่างระหว่างความผันแปรและ "ปกติ" คือความไม่แน่นอน กล่าวคือคุณสามารถแก้ไขเนื้อหาของNSMutableDictionary(และNSMutableArray) ในขณะที่คุณไม่สามารถทำได้ด้วย "ปกติ" NSDictionaryและNSArray


2
คุณไม่ควรรวมจำนวนเต็มใน NSNumber ใช่หรือไม่?
Johan Kool

ฉันมีปัญหาอีกอย่างหนึ่งเกี่ยวกับเรื่องนี้ ฉันต้องการจัดเก็บข้อความที่ผู้ใช้ป้อนเป็นสตริงรวมถึงการอ้างอิงรูปภาพ (ดัชนีในอาร์เรย์ของรูปภาพ) ซึ่งผู้ใช้บันทึกข้อความไว้ ฉันลอง mutableArray ของออบเจ็กต์ที่มี 2 ตัวแปรหนึ่งตัวสำหรับแต่ละตัวแปร ซึ่งทำงานได้ไม่ดีเมื่อพยายามเติมข้อมูล tableView ด้วยค่าข้อความวัตถุอาร์เรย์ ดังนั้นฉันจึงนึกถึงพจนานุกรมปัญหาเดียวคือดูเหมือนว่าฉันจะดึงข้อมูลด้วยดัชนีได้ต้องเป็นคีย์หรือค่าเหมือนแฮชแมปใช่ไหม
ระบบ

@ โจฮัน - แก้ไขและปรับปรุง! @alJaree - ใช่พจนานุกรมคือที่เก็บคีย์ - ค่าประเภทต่างๆ ฉันคิดว่าในตำแหน่งของคุณคุณจะดีกว่าเมื่อมีพจนานุกรมมากมาย บางอย่างเช่น[{image: "/path/to/img/1.jpg", data: "foo bar 1"}, {image: "/path/to/img/2.jpg", data: "foo bar 2"}, ..., {image: "/path/to/img/N.jpg", data: "foo bar N"}]
Eimantas

สิ่งนี้ยังคงใช้ไม่ได้สำหรับฉันเพราะฉันต้องดึงข้อความจากแต่ละวัตถุและใช้สิ่งนั้นเพื่อเติม UITableView รายการโปรดเช่นเดียวกับฉันต้องการการอ้างอิงดัชนีไปยังอาร์เรย์รูปภาพเพื่อที่ฉันจะได้ดึงและแสดงภาพโปรดที่เลือก ฉันลองใช้วัตถุที่ฉันอธิบายไว้ข้างต้น แต่วัตถุที่ส่งคืนเมื่ออ่านจากอาร์เรย์ที่ NSStrings ด้วยเหตุผลบางประการแทนที่จะเป็นวัตถุเฉพาะที่เก็บไว้ ฉันไม่แน่ใจว่าจะทำอย่างไรที่นี่
ระบบ

ฉันคิดว่าฉันอาจต้องจัดเก็บ NSStrings เช่น @ "% d _% @, ดัชนี, บันทึกหัวข้อจากนั้นแยก NSString และรับและจุ่มสิ่งที่ฉันต้องการฉันกำลังคิดในแง่จาวาว่าต้องมี แยกฟังก์ชันใน obj c. :)
ระบบ

16

เมื่อมีการประกาศอาร์เรย์เราจะต้องเพิ่มคีย์ - ค่าใน NSDictionary เช่น

NSDictionary *normalDict = [[NSDictionary alloc]initWithObjectsAndKeys:@"Value1",@"Key1",@"Value2",@"Key2",@"Value3",@"Key3",nil];

เราไม่สามารถเพิ่มหรือลบค่าคีย์ใน NSDictionary นี้ได้

โดยที่ใน NSMutableDictionary เราสามารถเพิ่มวัตถุหลังจาก intialization ของอาร์เรย์ได้โดยใช้วิธีนี้

NSMutableDictionary *mutableDict = [[NSMutableDictionary alloc]init];'
[mutableDict setObject:@"Value1" forKey:@"Key1"];
[mutableDict setObject:@"Value2" forKey:@"Key2"];
[mutableDict setObject:@"Value3" forKey:@"Key3"];

สำหรับการลบค่าคีย์เราต้องใช้รหัสต่อไปนี้

[mutableDict removeObject:@"Value1" forKey:@"Key1"];

12

อัปเดตเวอร์ชัน

วัตถุประสงค์ -C

สร้าง:

NSDictionary *dictionary = @{@"myKey1": @7, @"myKey2": @5}; 

เปลี่ยนแปลง:

NSMutableDictionary *mutableDictionary = [dictionary mutableCopy];     //Make the dictionary mutable to change/add
mutableDictionary[@"myKey3"] = @3;

Objective-C Literalsไวยากรณ์สั้นมือที่เรียกว่า

รวดเร็ว

สร้าง:

var dictionary = ["myKey1": 7, "myKey2": 5]

เปลี่ยนแปลง:

dictionary["myKey3"] = 3

1

ที่คุณต้องการถามคือ "อะไรคือความแตกต่างระหว่างอาร์เรย์หรือพจนานุกรมที่ไม่เปลี่ยนแปลงและไม่เปลี่ยนแปลง" หลายครั้งมีการใช้คำศัพท์ที่แตกต่างกันเพื่ออธิบายสิ่งที่คุณรู้อยู่แล้ว ในกรณีนี้คุณสามารถแทนที่คำว่า "mutable" ด้วย "dynamic" ดังนั้นพจนานุกรมหรืออาร์เรย์ที่เปลี่ยนรูปแบบได้จึงเป็นแบบ "ไดนามิก" และสามารถเปลี่ยนแปลงได้ในขณะรันไทม์ในขณะที่พจนานุกรมหรืออาร์เรย์ที่ไม่แปรเปลี่ยนเป็นคำที่ "คงที่" และกำหนดไว้ในโค้ดของคุณและไม่เปลี่ยนแปลงเมื่อรันไทม์ (หรืออีกนัยหนึ่ง คุณจะไม่ต้องเพิ่มลบหรือจัดเรียงองค์ประกอบ)

เกี่ยวกับวิธีการทำคุณขอให้เราทำเอกสารซ้ำที่นี่ สิ่งที่คุณต้องทำคือค้นหาในโค้ดตัวอย่างและเอกสาร Xcode เพื่อดูว่ามันเป็นอย่างไร แต่สิ่งที่เปลี่ยนแปลงไม่ได้ก็ส่งผลให้ฉันเหมือนกันเมื่อฉันเรียนรู้ครั้งแรกดังนั้นฉันจะให้สิ่งนั้นแก่คุณ!


บางครั้งไม่มีคำอธิบายที่ดีเพียงพอเกี่ยวกับเอกสาร Xcode มันเข้าสู่ทฤษฎีที่ลึกซึ้งโดยไม่มีตัวอย่างที่ชัดเจนไม่เสมอไป แต่บางครั้ง : P ใช่ฉันเข้าใจส่วนที่เปลี่ยนแปลงได้ (สามารถที่จะกลายพันธุ์) ได้แล้วขอบคุณ :)
ระบบ

0

สำหรับการอ้างอิงคุณยังสามารถใช้initWithDictionaryเพื่อเริ่มต้นNSMutableDictionaryด้วยตัวอักษร:

NSMutableDictionary buttons = [[NSMutableDictionary alloc] initWithDictionary: @{
    @"touch": @0,
    @"app": @0,
    @"back": @0,
    @"volup": @0,
    @"voldown": @0
}];
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.