2011-12-24 40 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是一個非正式的協議,它支持鍵值編碼。它是Foundation的一部分,所以它已經爲您提供。

您可以嘗試覆蓋valueForUndefinedKey,當您嘗試以KVC方式訪問某些內容不存在屬性或符合KVC標準的訪問器時,會調用該函數。然後,在覆蓋方法,你可以只在關鍵的值傳遞給詞典:

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

沾些錯誤在那裏檢查,你應該是好去。

現在,當你撥打:

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

,如果沒有財產稱爲Key1並沒有返回稱爲Key1它會調用valueForUndefinedKey:theKey一個對象,它會調用到你的字典分配給對象的方法鑰匙@「Key1」。

+0

你的答案是點睛之筆,雖然我會有點擔心OP爲什麼需要做這樣的事情。總的來說,如果它不會產生真正令人信服的好處,那麼將這種魔法引入代碼庫似乎最好是謹慎的。 – jlehr 2011-12-24 20:42:36

+0

@jlehr:我正在尋找類似Javascript的字典訪問。我確實有一個理由。 – noamtm 2011-12-25 09:10:20

+0

@Abizern:這*幾乎*我想要的。在你上面的例子中,我希望能夠調用[obj Key1],而不是[obj @「Key1」]。 – noamtm 2011-12-25 09:20:24