2009-11-19 18 views
66

Tôi đang phát triển một ứng dụng mà tôi muốn sử dụng một số NSDictionary. Bất cứ ai có thể xin vui lòng gửi cho tôi một mã mẫu giải thích các thủ tục làm thế nào để sử dụng một NSDictionary để lưu trữ dữ liệu với một ví dụ hoàn hảo?Làm thế nào chúng ta có thể lưu trữ vào một NSDictionary? Sự khác biệt giữa NSDictionary và NSMutableDictionary là gì?

+52

Bạn có thể bắt đầu bằng cách xem xét các tài liệu NSDictionary ... – stefanB

+7

các RTFMs lịch sự bằng cách nào đó có vẻ nhiều hơn ăn da hơn so với những người rõ ràng. –

+1

@stefanB Đối với rất nhiều lập trình viên mới, tài liệu chính thức thường rất phức tạp và khó hiểu vì vậy một cái nhìn cơ bản về _x_ trên SO giúp đỡ. –

Trả lời

189

Tài liệu NSDictionaryNSMutableDictionary có lẽ là lựa chọn tốt nhất của bạn. Họ thậm chí có một số ví dụ tuyệt vời về cách làm những việc khác nhau, giống như ...

... tạo ra một NSDictionary

NSArray *keys = [NSArray arrayWithObjects:@"key1", @"key2", nil]; 
NSArray *objects = [NSArray arrayWithObjects:@"value1", @"value2", nil]; 
NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:objects 
                 forKeys:keys];

... lặp trên nó

for (id key in dictionary) { 
    NSLog(@"key: %@, value: %@", key, [dictionary objectForKey:key]); 
}

... làm cho nó có thể biến đổi

NSMutableDictionary *mutableDict = [dictionary mutableCopy];

Lưu ý: phiên bản lịch sử trước năm 2010: [[Từ điển mutableCopy] autorelease]

... và thay đổi nó

[mutableDict setObject:@"value3" forKey:@"key3"];

... sau đó lưu nó vào một tập tin

[mutableDict writeToFile:@"path/to/file" atomically:YES];

... và đọc lại aga trong

NSMutableDictionary *anotherDict = [NSMutableDictionary dictionaryWithContentsOfFile:@"path/to/file"];

... đọc một giá trị

NSString *x = [anotherDict objectForKey:@"key1"]; 

... kiểm tra xem một chìa khóa tồn tại

if ([anotherDict objectForKey:@"key999"] == nil) NSLog(@"that key is not there"); 

... sử dụng đáng sợ tương lai cú pháp

Từ năm 2014, bạn có thể thực sự chỉ cần gõ dict [@ "chìa khóa"] chứ không phải [dict objectForKey: @ "chìa khóa"]

+0

Xin lỗi, lời nhận xét cuối cùng đó hơi khó hiểu. Cảm ơn đã chỉ ra điều đó. – Tim

+0

Tôi không nhìn thấy nó, vì vậy bạn tốt! :) – jtbandes

+0

Đúng ... Đã có một sự rò rỉ –

32
NSDictionary *dict = [NSDictionary dictionaryWithObject: @"String" forKey: @"Test"]; 
NSMutableDictionary *anotherDict = [NSMutableDictionary dictionary]; 

[anotherDict setObject: dict forKey: "sub-dictionary-key"]; 
[anotherDict setObject: @"Another String" forKey: @"another test"]; 

NSLog(@"Dictionary: %@, Mutable Dictionary: %@", dict, anotherDict); 

// now we can save these to a file 
NSString *savePath = [@"~/Documents/Saved.data" stringByExpandingTildeInPath]; 
[anotherDict writeToFile: savePath atomically: YES]; 

//and restore them 
NSMutableDictionary *restored = [NSDictionary dictionaryWithContentsOfFile: savePath]; 
+0

Giải thích tốt. Nó rất hữu ích .. –

+0

@Ben Gottlieb Phần một: Cảm ơn lời giải thích tốt đẹp. Trên thực tế tôi muốn lưu hai dữ liệu UItextField của tôi trong một tệp từ MutableDictionary. Ở đây bạn đã viết 'NSString * savePath = [@" ~/Documents/Saved.data "stringByExpandingTildeInPath];', bây giờ câu hỏi của tôi là, tập tin 'Saved.data' ở đây là gì? Làm sao tôi có thể làm được? – Tulon

+0

@Ben Gottlieb Phần thứ hai: Và trong trường hợp của tôi, tôi đặt một tệp văn bản (.rtf) vào thư mục sau đây 'Hỗ trợ tệp> MediaFiles> Tài liệu> userData.rtf'Bây giờ tôi có thể lưu các loại dữ liệu Mutabledictionary này trong tệp văn bản ? Và những gì sẽ là thư mục hoàn hảo trong trường hợp này? Tôi đã cố gắng với điều này '[userData writeToFile: @" MediaFiles/Documents/userData.rtf "atomically: YES];' & with this '[userData writeToFile: @" Documents/userData.rtf "atomically: YES];', but không hoạt động. Chúc một ngày tốt lành. – Tulon

18

Sự khác biệt chính: NSMutableDictionary thể được sửa đổi tại chỗ, NSDictionary không thể. Điều này đúng với tất cả các lớp NSMutable * khác trong Cocoa. NSMutableDictionary là một lớp con của NSDictionary, vì vậy mọi thứ bạn có thể làm với NSDictionary bạn có thể làm với cả hai. Tuy nhiên, NSMutableDictionary cũng thêm các phương thức bổ sung để sửa đổi mọi thứ tại chỗ, chẳng hạn như phương thức setObject:forKey:.

Bạn có thể chuyển đổi giữa hai như thế này:

NSMutableDictionary *mutable = [[dict mutableCopy] autorelease]; 
NSDictionary *dict = [[mutable copy] autorelease]; 

Có lẽ bạn muốn để lưu trữ dữ liệu bằng cách viết nó vào một tập tin.NSDictionary có một phương pháp để làm điều này (mà cũng làm việc với NSMutableDictionary):

BOOL success = [dict writeToFile:@"/file/path" atomically:YES]; 

Để đọc một cuốn từ điển từ một tập tin, có một phương pháp tương ứng:

NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:@"/file/path"]; 

Nếu bạn muốn đọc nội dung tập tin một NSMutableDictionary, chỉ cần sử dụng:

NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfFile:@"/file/path"]; 
+0

Cảm ơn bạn đã trả lời ... –

Các vấn đề liên quan