T2DictionaryConverting

Last-modified: 2006-09-12 (火) 06:26:15

@protocol T2DictionaryConverting

オブジェクトをNSDictionaryに変換/復帰したり、プロパティリストファイルとして保存するためのプロトコルです。

-(NSArray *)dictionaryConvertingKeysForUse:(T2DictionaryConvertingUse)use ;
このメソッドを呼ばれたインスタンスは、KVCに準拠したキーをNSArrayで返します。useはT2DictionaryEncodingRoot, T2DictionaryEncoding, T2DictionaryDecodingのいずれかです。T2DictionaryEncodingRootはそのオブジェクトがルートオブジェクトとしてエンコードされようとしていることを示しています。

上記のプロトコルを実装し、保存したいキーを返すオブジェクトは、簡単にNSDictionaryに変換、復帰できます。そのためのメソッドがNSObjectに追加されています。

@interface NSObject (T2NSObjectAdditions)

+(id)objectWithDictionary:(id)dic ;
変換されたNSDictionaryから、新規にインスタンスを作りオブジェクトを復帰します。
-(id)initWithEncodedDictionary:(NSDictionary *)dic ;
変換されたNSDictionaryからオブジェクトを復帰します。
-(void)setValuesWithEncodedDictionary:(NSDictionary *)dic ;
変換されたNSDictionaryを使って、既存のインスタンスのプロパティを設定します。
-(id)encodedDictionary ;
オブジェクトをNSDictionaryに変換します。

オブジェクトが変換されるとき

まずオブジェクトのdictionaryConvertingKeysForUseが呼ばれ、保存されるべきプロパティのキーが認識されます。キーに基づいてKVCを通じ、バリューオブジェクトを得ます。

バリューがNSString、NSDate、NSNumberだった場合:
そのままバリューとします。
バリューがNSArray、NSDictionaryだった場合:
その内容をNSDictionaryに変換し、NSArrayまたはNSDictionaryをバリューとします。
バリューがdictionaryConvertingKeysForUseを実装したオブジェクトだった場合:
NSDictionaryに変換し、バリューとします。
バリューがNSCodingに適合したオブジェクトだった場合:
NSKeyedArchiverを使ってNSDataに変換し、バリューとします。
それ以外:
無視されます。

以上によって全てのキーに対応するバリューを得ると、NSDictionaryを作成して、さらに「__className」をキーとしてクラスの名前が保存されます。

オブジェクトが復帰されるとき

「__className」に指定されたクラスのインスタンスが作成され、initWithEncodedDictionaryが呼ばれます。NSObjectの実装ではinitが呼ばれた後にKVCを通じて各プロパティが設定されます。
初期化時にNSDictionaryの内容を得る必要がある場合は、initWithEncodedDictionaryをオーバーライドすることも出来ます。T2IdentifiedObjectがこれを行っています。

NSDictionaryに変換できるオブジェクト

dictionaryConvertingKeysForUseを実装したオブジェクトは、以下のようなプロパティを保存できます。

  • NSString, NSDate, NSNumber
  • int, unsigned int, floatなどNSNumberに変換される基本型
  • dictionaryConvertingKeysForUseを実装したオブジェクト
  • NSColorなどNSCodingに適合するオブジェクト
  • NSArray, NSDictionary, またそれに上記のオブジェクトを格納したもの

ただし、循環参照しているオブジェクトを保存することは出来ません。