ValueTransformer
アプリケーションを作る際に、様々な型を相互に変換するユーティリティがあると便利だ。
-
- オブジェクトとプリミティブ
- オブジェクトとコレクション
- オブジェクトとXML(ファイル)
このような機能を持たせた「コンバータ」をAndroid(Java)では必要に応じて用意してきた。C#ではTypeConverter抽象クラスが用意されており、具象クラスを書くことで比較的簡単にコンバータが用意できた。
Objective-CにはValueTransformerが用意されており、NSValueTransformerクラスを継承したクラスを書くことで型変換を実施することができる。
まず欲しいのはNSDictionaryとユーザ定義のクラスを相互に変換するためのValueTransformer。これがあると例えばNSDefaultsとモデルオブジェクトの相互の変換ができることになり、設定画面の機能を作ることが非常に楽になると思うのだ。また、Viewとモデルとのデータのバインドでも必ず必要になる機能である。
ということで現在書いている。
処理としては、
オブジェクト->NSDictionary
1. メタクラスからプロパティの情報を収集
2. プロパティ情報を使ってオブジェクトのプロパティ値を全て取得
3. プロパティ名をキーにして辞書にプロパティ値をセット
NSDictionary->オブジェクト
1. メタクラスからプロパティの情報を収集
2. プロパティ名で辞書を検索、存在していればプロパティ値を取得
3. オブジェクトのプロパティにプロパティ値をセット
この二通りをそれぞれNSValueTransformer-transformedValue、NSValueTransformer-reverseTransformedValueメソッドで実装してやれば良い。
と書くのは簡単だが、実際にはオブジェクトのプロパティ値を辞書に格納する際にスカラ型(int, char*, double, BOOL, etc.)だった場合はオブジェクト型にラップが必要であり、辞書からオブジェクトを復旧する際にはその逆のアンラップ処理が必要になり、これが結構やっかいだ。※
需要があればGithub等で公開しようと思う。
※Objective-Cのコレクションはオブジェクト型のデータしか格納できない。(nilですら格納できない)