NSUserDefaults/NSCodingによる設定情報の保存 (7/8)
作成:2013-03-25 08:28
更新:2013-03-25 08:28
更新:2013-03-25 08:28
■NSDictionaryに保存したSampleDataを保存するには?
これでSampleDataの設定ファイル保存はできるようになりました。そこで、応用としてワンランク上を目指してみましょう。それは、「SampleDataを保存したNSDictionaryを保存する」ということです。
一応、SampleDataをNSUserDefaultsで保存できるようにはなりましたが、SampleDataを保管したNSDictionaryをそのままsetObject: forKey:で保存しようとすると、やっぱりエラーになります。NSDictionaryに保管されているSampleDataをそれぞれエンコードして保存したりするための機能はもっていないからです。
では、どうするか? やっぱり、そのためのメソッドをNSUserDefaultsに追加してやるのがよさそうですね。というわけで、下のリスト欄のようなコードを書いてみました。
ここでは、setSampleDataDic: forKey:と、sampleDataDicForKey:の2つのメソッドを更に追加してあります。どうやってNSDictionaryを保存するかですが、ここでは「キーをまとめてNSArrayとして保存し、中のSampleDataは1つ1つNSDataに変換して保存する」という形にしてみました。この方法だと、万が一、NSArrayのキーと同じ名前のキーでSampleDataが保存されたりすると上書きされてデータが破損する可能性がありますので、あんまりおすすめできるやり方ではありませんが、まぁわかりやすい方法だろうといことで……。
メソッドの内容はさほど難しいわけではないので、それぞれでコードを読んでみてください。これでSampleDataをそのまま保存するだけでなく、名前をつけてNSDictionaryに保管したものを保存できるようになりました!
一応、SampleDataをNSUserDefaultsで保存できるようにはなりましたが、SampleDataを保管したNSDictionaryをそのままsetObject: forKey:で保存しようとすると、やっぱりエラーになります。NSDictionaryに保管されているSampleDataをそれぞれエンコードして保存したりするための機能はもっていないからです。
では、どうするか? やっぱり、そのためのメソッドをNSUserDefaultsに追加してやるのがよさそうですね。というわけで、下のリスト欄のようなコードを書いてみました。
ここでは、setSampleDataDic: forKey:と、sampleDataDicForKey:の2つのメソッドを更に追加してあります。どうやってNSDictionaryを保存するかですが、ここでは「キーをまとめてNSArrayとして保存し、中のSampleDataは1つ1つNSDataに変換して保存する」という形にしてみました。この方法だと、万が一、NSArrayのキーと同じ名前のキーでSampleDataが保存されたりすると上書きされてデータが破損する可能性がありますので、あんまりおすすめできるやり方ではありませんが、まぁわかりやすい方法だろうといことで……。
メソッドの内容はさほど難しいわけではないので、それぞれでコードを読んでみてください。これでSampleDataをそのまま保存するだけでなく、名前をつけてNSDictionaryに保管したものを保存できるようになりました!
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
※NSUserDefaultsの拡張(SampleData.h) @interface NSUserDefaults(SampleDataSupport) -(void)setSampleData:(SampleData*)obj forKey:(NSString*)aKey; -(SampleData*)sampleDataForKey:(NSString*)aKey; -(void)setSampleDataDic:(NSDictionary*)obj forKey:(NSString*)aKey; -(NSMutableDictionary*)sampleDataDicForKey:(NSString*)aKey; @end ※NSUserDefaultsの拡張(SampleData.m) @implementation NSUserDefaults(SampleDataSupport) -(void)setSampleData:(SampleData*)obj forKey:(NSString*)aKey { 略 } -(SampleData*)sampleDataForKey:(NSString*)aKey { 略 } -(void)setSampleDataDic:(NSDictionary*)obj forKey:(NSString*)aKey { NSArray* keyarr = [obj allKeys]; [self setObject:keyarr forKey:aKey]; for (int i = 0; i < [keyarr count]; i++) { SampleData* val = [obj objectForKey:[keyarr objectAtIndex:i]]; [self setSampleData:val forKey:[keyarr objectAtIndex:i]]; } } -(NSMutableDictionary*)sampleDataDicForKey:(NSString*)aKey { NSMutableDictionary* dic = [NSMutableDictionary dictionary]; NSArray* keyarr = [self arrayForKey:aKey]; for (int i = 0;i < [keyarr count]; i++){ SampleData* val = [self sampleDataForKey:[keyarr objectAtIndex:i]]; [dic setObject:val forKey:[keyarr objectAtIndex:i]]; } return dic; } @end
※関連コンテンツ
「初心者のためのObjective-Cプログラミング入門」に戻る