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プログラミング入門」に戻る