2011-12-24 9 views
2

私のobj-cクラスでは、文字列をオブジェクトにマッピングする辞書があります。代わりにやっての今objective-c辞書アクセスとしてのプロパティ/メソッド

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 
    @"value1", @"key1", @"value2", @"key2", nil]; 
MyClass* obj = [[MyClass alloc] initWithDictionary:dict]; 

、:

私がやりたい
NSString* val1 = [obj value:@"key1"]; 

NSString* val1 = [obj key1]; // @"value1" 
NSString* val2 = [obj key2]; // @"value2" 
NSString* val3 = [obj key3]; // nil, not found 

ことは可能ですか?

もちろん、これは、(a)辞書キーが有効な識別子名であることを前提としています。 (b)同じ名前の「実際の」プロパティ/メソッドはありません(これはおそらく実際のメソッドを代わりに呼び出すでしょう)。

答えて

5

NSKeyValueCodingは、キー値コーディングを有効にする非公式プロトコルです。これは財団の一部なので、既に利用可能です。

プロパティまたはKVC準拠アクセサがないKVCの方法で何かにアクセスしようとすると呼び出されるvalueForUndefinedKeyをオーバーライドすることができます。

- (id) valueForUndefinedKey: (NSString*)aKey { 
    return [obj objectForKey:aKey]; 
} 

スティックそこにチェック若干の誤差は、あなたが行ってもいいようになります。その後、オーバーライドされた方法では、あなただけの辞書にキーの値を渡すことができます。今

あなたが呼び出すとき:

NSString *theKey = @"Key1"; 
NSString *val1 = [obj theKey]; 

Key1と呼ばれる何のプロパティが存在しないとに割り当てられたオブジェクトのためのあなたの辞書に呼び出します、それはvalueForUndefinedKey:theKeyを呼び出しますKey1と呼ばれるオブジェクトを返す方法がない場合キー@ "Key1"。

+0

あなたの答えはスポットライトですが、OPがなぜこのようなことをする必要があると感じるのか少し気になります。一般的に、この種の魔法をコードベースに導入することは、本当に魅力的なメリットをもたらさない場合には、慎重であるように思われます。 – jlehr

+0

@jlehr:私はJavascriptのような辞書アクセスを探しています。私は実際にそれの理由があります。 – noamtm

+0

@Abizern:これは*ほぼ*私が望んでいたものです。上記の例では、[obj @ "Key1"]ではなく[obj Key1]を呼び出すことができます。 – noamtm

関連する問題