@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, またそれに上記のオブジェクトを格納したもの
ただし、循環参照しているオブジェクトを保存することは出来ません。