2011年12月6日火曜日

プロパティを NSDictionary 化して保存・復元可能にするライブラリ

任意のインスタンスのプロパティを NSDictionary化、もしく NSDictionaryからインスタンスを復元するライブラリ。NSDictionaryをファイルへ書きだせばインスタンスの永続化が簡単に実現できる。NSObjectのカテゴリとしてメソッドが提供されている。

例えば
@implementation Sample
@property (nonatomic, retain) name;
@property (nonatomic, retain) email;
@end
というクラスがあった場合こんな感じでインスタンスをファイルに保存できる。
Sample* obj = [[Sample alloc] init];
obj.name = @"hello";
obj.email = @"he@llo.com";
NSDictionary* dict = [obj dictionaryRepresentation];
[dict writeToFile:@"sample.plist" atomically:YES];
簡単。復元はこの逆。これも簡単。
NSDictionary* dict = [NSDictionary dictionaryWithContentsOfFile:@"sample.plist"];
Sample* obj = [Sample objectWithDictionaryRepresentation:dict];
保存対象のプロパティを指定することができる。その場合は AMCKeysForDictionaryRepresentation をオーバーライドする。

対応しているプロパティの型は次の通り。構造体にも一部対応している。
Supported properties types

AMC Enabled Objects.
Common Collections (NSArray, NSMutableArray, NSDictionary, NSMutableDictionary)
Custom Collections (Mutable/Not-Mutable, that can be used as keyValue(Dictionary) or Ordered(Array) collections )
Common Structures (NSRect/CGRect, NSSize/CGSize, NSPoint/CGPoint).
Custom Structures (You will need to write additional code to encode/decode them to/from NSString).


仕組みは Objective-C のランタイムAPI を使い、プロパティを列挙してその名前をキーにして値を NSDictionary へ入れている。NSCoder/NSKeyedArchiver等は使っていない。ソースコードは Objective-CランタイムAPIの特にリフレクション系関数の使い方のお手本にもなる。


0 件のコメント:

コメントを投稿