我们如何存储到NSDictionary中?NSDictionary和NSMutableDictionary有什么区别?


68

我正在开发要使用的应用程序NSDictionary。任何人都可以给我发送示例代码来说明如何使用NSDictionary示例存储数据的过程吗?


52
您可以先看一下NSDictionary文档...
stefanB

7
礼貌的RTFM似乎比显式的更具腐蚀性。
唐·维纳德

1
@stefanB对于许多新程序员而言,正式文档通常非常复杂且令人困惑,因此对SO上x的基本看法会有所帮助。
Lazar Kukolj '17

Answers:


191

NSDictionary中的NSMutableDictionary文档可能是你最好的选择。他们甚至在如何做各种事情上都有很好的例子,例如...

...创建一个NSDictionary

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

...重复

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

...使其可变

NSMutableDictionary *mutableDict = [dictionary mutableCopy];

注意:2010年之前的历史版本:[[dictionary mutableCopy]自动发布]

...并更改它

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

...然后将其存储到文件中

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

...然后再读一次

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

...读取值

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

...检查钥匙是否存在

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

...使用可怕的未来派语法

从2014年开始,您实际上可以键入dict [@“ key”]而不是[dict objectForKey:@“ key”]


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];

@本·戈特利布(Ben Gottlieb)第一部分:非常感谢您的解释。实际上,我想将我的两个UItextField数据保存到MutableDictionary中的文件中。在这里您写了NSString *savePath = [@"~/Documents/Saved.data" stringByExpandingTildeInPath];,现在我的问题是,Saved.data这里的文件是什么?我该怎么做?
Tulon 2014年

@Ben Gottlieb第二部分:在我的情况下,我将文本文件(.rtf)放在以下目录中Supporting files > MediaFiles > Documents > userData.rtf。现在可以将这些类型的Mutabledictionary数据保存在文本文件中吗?在这种情况下,理想的目录是什么?我用这个困难[userData writeToFile:@"MediaFiles/Documents/userData.rtf" atomically:YES];和这个[userData writeToFile:@"Documents/userData.rtf" atomically:YES];,但没有奏效。祝你有美好的一天。
隆2014年

18

关键区别:NSMutableDictionary可以就地修改,NSDictionary不能。这对于可可中的所有其他NSMutable *类都是如此。NSMutableDictionary是NSDictionary的子类,因此您可以对NSDictionary进行的所有操作都可以对两者进行处理。但是,NSMutableDictionary也添加了补充方法来修改适当的位置,例如method setObject:forKey:

您可以像这样在两者之间转换:

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

大概您想通过将数据写入文件来存储数据。NSDictionary具有执行此操作的方法(也可与NSMutableDictionary一起使用):

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

要从文件中读取字典,有相应的方法:

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

如果要以NSMutableDictionary格式读取文件,只需使用:

NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfFile:@"/file/path"];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.