2008-12-19 20 views
3

我有一個直接轉發實例變量的對象。有些是NSString的,有些是無符號整數,等我的印象鍵 - 值編碼是在編寫腳本,我可以寫代碼,如下面的下:鍵值編碼及其腳本編寫能力

id key, value; 
    key  = [[attributes objectAtIndex:j] name]; 
    value = [[attributes objectAtIndex:j] stringValue]; 
    [obj setValue:value forKey:key]; 

的原因,我使用stringValue的位置和名稱我正在使用TouchXML並從XML提要構建對象。

上面的代碼崩潰,如果我試圖分配任何東西到一個整數。如果我將unsigned int更改爲NSString的實例,則不會有任何運行時崩潰。據我的理解,Key-Value編碼足夠聰明以檢測這些問題。

我可能的解決方案是什麼?我怎樣才能儘可能多地抽象出來,這樣我就可以在許多不同的類上運行相同的方法,這些類都有自己的實例變量?

是最優雅的方法來真正覆蓋我的setter並使用NSNumber將字符串轉換爲類型int,我認爲這已經由KVC處理?

回答

3

KVC沒有做任何的強制類型轉換/翻譯的內部,讓你進入setValue:forKey:對象的類型必須與實例變量將存儲在類型相匹配。本機類型,如intlong等。被打包成NSNumber對象,而像結構這樣的東西被打包成NSValue對象。要設置一個聲明爲本機類型的值,應該爲value參數傳入適當的包裝器對象。

我還建議在調用setter的代碼中進行所需的翻譯,而不是在setter本身中進行。儘管如此,這更多是意見的問題,所以我想如果你真的想要的話,你可以在二傳手中翻譯一些東西。我的代碼版本如下所示:

id key, value; 
key = [[attributes objectAtIndex:j] name]; 
value = [NSNumber numberWithInt:[[[attributes objectAtIndex:j] stringValue] intValue]]; 
[obj setValue:value forKey:key];