DTOとしてのNSDictionary
NSDictionaryの中身は変更できない。ゆえに使い回しはきかない。しかし一時的に使うには便利だ。例えばデータの受け渡し。データが変更されていない、という保証は大きなアドバンテージだ。内容証明付きの郵便なら、受取人は神経質に中身をチェックする必要がない。問題は鍵だ。多くの場合、dictionaryのkeyは文字列となる。この文字列をいかに送り手と受け手でいかに共有するべきか。最もプリミティブな書き方は、それぞれのソースに直接書くことだ。 //送り手 id sendingObject = @"theObject"; NSDictionary *dictionary = [NSDictionary dictionaryWithObject:sendingObject forKey:@"myKey"];//受け手 id receivedObject = [dictionary objectForKey:@"myKey"];しかしこれは推奨できない。文字列はコンパイラが見てくれない。送り手側のmykeyを間違えてmvkeyと書いても、実行してエラーが起こるまで気がつかない。そこで、マクロによって一カ所に定義を寄せるという手段がでてくる。#define MyKey @"myKey"このマクロを送り手のヘッダファイルに置くなどして共有すれば、上記の問題が回避できる。次に、可読性の観点からもう一歩進めてみよう。dictionaryの中身が増えた場合、マクロの方法だとid myObject1 = [dictionary objectForKey:MyKey1]id myObject2 = [dictionary objectForKey:MyKey2]id myObject3 = [dictionary objectForKey:MyKey3]として取り出すことになる。objectForKeyが並ぶのがどうも目障りだ。そこで、カテゴリを使ってdictionaryを擬似的なDTOクラスにしてしまうという方法が思いつく。@interface NSDictionary(MyDto)@property(nonatomic, readonly)id myObject1;@property(nonatomic, readonly)id myObject2;+ (NSDictionary *)dtoWithMyObject1:(id)object1 myObject2:(id)object2; @end#define MyKey1 @"myKey1"#define MyKey2 @"myKey2"@implementation NSDictionary(MyDto)@dynamic myObject1, myObject2;- (id)myObject1{ return [self objectForKey:MyKey1];}- (id)myObject2{ return [self objectForKey:MyKey2];}+ (NSDictionary *)dtoWithMyObject1:(id)object1 myObject2:(id)object2{ return [self dictionaryWithObjectsAndKeys: object1, MyKey1, object2, MyKey2, nil];}@endこのカテゴリを読み込みさえすれば、送り手と受けてのやりとりは以下のように簡素化できる。//送り手id dto = [NSDictionary dtoWithMyObject1:object1 myObject2:object2];//受け手id object1 = dto.myObject1id object2 = dto.myObject2【送料無料】ぜんぶ実際に買って試してみましたiPad&iPhoneアプリの使える度チェック