web-dev-qa-db-ja.com

NSDictionaryに保存するにはどうすればよいですか? NSDictionaryとNSMutableDictionaryの違いは何ですか?

NSDictionaryを使用したいアプリケーションを開発しています。完璧な例でNSDictionaryを使用してデータを保存する手順を説明するサンプルコードを送ってください。

68

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

...そしてそれを変更する

[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 objectForKey:@ "key"]ではなくdict [@ "key"]と入力できます

191
Tim
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];
32
Ben Gottlieb

主な違い:NSMutableDictionaryはその場で変更できますが、NSDictionaryは変更できません。これは、Cocoaの他のすべてのNSMutable *クラスに当てはまります。 NSMutableDictionaryは、NSDictionaryのsubclassであるため、NSDictionaryでできることは両方でできます。ただし、NSMutableDictionaryは、メソッドsetObject:forKey:などの適切なものを変更する補完的なメソッドも追加します。

次のように2つの間で変換できます。

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"];
18
jtbandes