KVC「キー値コーディング」

KFC、いやKVC(キー値コーディング)とはNSKeyValueCoding非形式プロトコルによる、間接的なオブジェクトのプロパティへのアクセスとバリデーションのためのフレームワークを指す。
NSKeyValueCoding Protocol Reference - Mac OS X Developer Library

NSKeyValueCoding非形式プロトコルなので、Javaのインタフェースのように実装が強制されるものではなく、クラスエクステンションとして実装されるためNSObjectから使える便利なものだ。

ではどうやって実装を縛るのか? いや、縛る必要は無いがある程度規約に準じた※クラスの実装が必要になる。

KVCに準拠する

KVCに準拠するためにはKVCがキー値でアクセスできるように名付けされたアクセッサメソッドを用意しておく必要がある。
一番簡単なのは@proerty〜@synthesizeで合成される自動生成アクセッサメソッドを使用することである。

@interface KVCModel
@property (strong, nonatomic) NSObject *name;
@property (strong, nonatomic) NSObject *address;
@end

@implementation KVCModel
@synthesize name;
@synthesize address;
@end

こうすることにより、プロパティnameとaddressにアクセスする際にコンベンショナルな

//property direct access 
NSString *name = [model name];
[model setName:@"Kazz"];

NSString *address = [model address];
[model setAddreee:@"Japan Tokyo"];

という直接アクセスの他に、以下のように間接的にアクセスできるのがKVCである。

//kvc dynamic access
NSString *name = [model valueForKey:[@"name"]];
[model setValue:@"Kazz" forKey:@"name"];

NSString *address = [model valueForKey:[@"address"]];
[model setValue:@"Japan Tokyo" forKey:@"address"];

KVCはオブジェクトの全てのプロパティを一種類のコードでランタイムに取得及び設定することができる為、処理の拡張性や柔軟性が高まるが、わざわざ間接化しているため、メソッドの有無のチェックはされないことに注意が必要である。

KVCは同じくKVOキー値監視(Key-Value Observing)やCocoa Bindingで利用されている非常に重要な技術だが、Java BeansのリフレクションやイントロスペクションをObjective-Cで簡単に使うことを目指したのではないかと推測するが、どうだろう。

私的にはバリデーションが組込まれているのが非常に興味を引かれるのだが、KVOも含めて先に調べることがあるので今回は触れないでおく。

※ある程度と書いたのは、許されているアクセッサのパターンがあり、そのパターンにマッチすればアクセスに成功するからだ。(詳しくはドキュメントを読む必要がある)