2011-03-17 177 views
1

我想解析XML來填充符合KVC的對象,但是,我的解析器非常笨拙,它只是從XML屬性/標記組裝NSStrings並嘗試通過KVC設置它們。強制KVC類型

這適用於實際的字符串和數字(​​我相信),但我還需要設置日期。問題很明顯,解析器不知道字符串表示日期,並且試圖使用vanilla KVC調用坐在它上面 - 之後KVC框架會抱怨類型不匹配(在日期字段中設置字符串)。

是否有一種編程方式將'攔截'到KVC框架中,以便我可以更改正在設置的數據(通過NSDateFormatter運行日期字符串)?

我可以在解析器中添加一些智能,但在這樣做之前,有沒有其他這種類型的問題的知名解決方案?

回答

2

這可能不是完美的解決方案,但是......我想與大家分享我的想法;)

所以,首先,看看這裏:Key-Value Coding - Validation。該文檔描述了一種在通過KVC設置時驗證變量的簡便方法。你可以使用你的優勢是:

  1. 首先實現你的類變量KV驗證方法
  2. 設置你的價值
  3. 在您的驗證方法檢查,如果它是一個日期/串/無論你想 - 和將其更改爲適當的類型。

這應該提供一個乾淨的實現,以確保正確的類型。

乾杯, 帕維爾

+0

+1我想我可能更喜歡使用驗證來回答我的問題。如果有幾個需要強制的屬性,它肯定會使代碼更加整潔。 – paulbailey 2011-03-17 20:46:42

+0

我看到了這個功能......但沒有發現我實際上可以替換這個對象。好的電話。它也似乎是在現場級別實施,即:沒有字段名稱比較/查找(驗證:錯誤:)我需要管理我正在替換的對象的內存嗎?我敢打賭,我需要autorelease新的NSDate ...特別是如果它被設置(非原子,保留)財產。唯一的另一個問題是,這個領域的一些集合可能不需要轉換爲日期(他們已經是)。我會試着模擬一個性能測試。再次感謝! – 2011-03-17 21:28:46

0

隨着KVC,一切都會通過默認實現setValue:forKey:這就是所謂的適當的增變器方法(as described here)。

您可以覆蓋setValue:forKey:以檢查需要轉換的密鑰或密鑰,並進行適當的更改。

- (void)setValue:(id)value forKey:(NSString *)key 
{ 
    if([key isEqualToString:@"someDate"]) { 
     NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
     someDate = [dateFormatter dateFromString:value]; 
     value = somedate; 
    } 

    [super setValue:value forKey:key]; 
} 

,從內存的,所以不能保證是否會真正編譯和運行。 ;-)

+0

感謝保羅。這絕對是一種可能性。從性能角度來看,我可能需要量化字符串比較的性能損失。另一個問題是...有時候,程序的其他部分可能會嘗試在這個字段上設置一個真正的NSDate ......在這種情況下,我也必須檢查類的類型。感謝您的建議。 – 2011-03-17 21:22:56

+0

如果有可能會傳入正確的類型,那麼我建議Pawel的答案。我認爲字符串比較表現的不錯,特別是在解析XML的情況下。 – paulbailey 2011-03-17 21:28:00