2008-11-18 16 views
3

說我有以下的Objective-C類:我如何一般使用KVC更新字段?

@interface Foo { 
    int someNumber; 
    NSString *someString; 
} 

和原因,我不會進入這裏,我想用KVC更新,以通用的方式,對這些變量的值:

[f setValue:object forKey:@"someNumber"]; 

or 

[f setValue:object forKey:@"someString"];` 

如果object是一個字符串,我更新someNumber變量,看來我需要知道使用NSNumberFormatter獲得一個NSNumber然後可可自動轉換到內部setValue:forKey:一個int。

有沒有什麼辦法可以避免這個自定義代碼,並讓Cocoa從字符串推斷轉換爲int,還是我需要每次都捕獲這種情況並自己處理它?

回答

1

您應該使用數字格式化程序自己完成轉換,它比框架認爲合適的任何東西都可以提供更好的控制。使用對象的單個實例更新ivars的值也可能不是一個好主意。更合適的是,你可以根據對象的類來執行你的更新(假設你沒有通過存儲在id中,那麼通過object_getClassName查詢對象的類。)更多的信息可以在Objective-C 2.0中找到但是一般來說,你可能會在代碼中發現錯誤,因爲這樣做

2

下面的代碼應該自動處理轉換,只要object參數是一個類的成員實現integerValue

注意兩個NSNumberNSString實現此方法。

- (void)setValue:(id)object forKey:(NSString *)key 
{ 
    if ([key isEqual:@"someNumber"]) 
    { 
     someNumber = [object integerValue]; 
    } 
    //... 
}

編輯:(邊注): 可避免使用Objective-C的屬性自己寫的方法。只要您爲someNumbersomeString創建屬性,setValue:forKey:的默認實現將爲您完成工作。

1

我對這個有着敏銳的洞察力。我認爲setValue:forKey:等同於直接調用setter。如果你有一個方法:

- (void)setSomeValue:(NSInteger)aValue 

你不希望能夠通過一個NSString,並希望該方法可以計算出來。

換句話說,一個鍵值允許你訪問一個屬性,並且該屬性有一個類型。在使用KVC時,數字只是包裝在NSNumber對象中,因此只有一個setValue:forKey:方法。因此,我說調用代碼的責任始終是將字符串打包到NSNumber對象中。

這就像是這些我感嘆Cocoa Touch不支持綁定。綁定將允許您添加一個值轉換器,可以自動爲您處理從字符串到數字的轉換。也許在下一個版本!

相關問題