2016-03-04 54 views
0

我有一個String屬性的對象。我必須使用鍵值編碼從外部設置該屬性。因此,我正在使用self.setValue(value, forKeyPath: key)斯威夫特KVC設置NSNumber值爲字符串鍵

這裏的問題是,我可以設置一個NSNumber作爲導致崩潰的消息-[__NSCFNumber length]: unrecognized selector sent to instance的值。我如何在值和屬性之間進行類型檢查以避免崩潰?

值給我NSObject回作爲dynamicType。 和obj.valueForKey(key).dynamicType讓我回到AnyObject?

我試了一下,並且可以做的是一樣的東西:

if (obj.valueForKey(key) is String && value is String) {...} 

的事情是,我的對象有明顯多於一個String屬性,它具有許多特性。而我試圖做的是遍歷所有屬性並將它們設置爲來自Web服務的特定值。現在,我需要一個通用的數據類型檢查,看看是否有類型不匹配,像

if (obj.valueForKey(key).realtype == value.realtype) {...} 
+0

爲什麼你需要使用'setValue:forKeyPath:'而不是直接設置值? – Abizern

+0

很高興能夠看到你的課...... – sergio

+0

,因爲這是一個解析器的一部分,它從一個objc庫中檢索數據並在幾個swift對象中設置這些值。我只有對象的父類不是實際的類。我不想將它轉換爲實際的類,因爲有很多,我需要一個巨大的if/switch語句才能通過它們。 – Se7enDays

回答

0

如果你知道你的keyPath接受一個字符串,則可以使用斯威夫特as?操作,以確保您指定的值可以施展它。 喜歡的東西:

self.setValue(value as? String ?? "Bad value", forKeyPath: key) 

通過這樣做,可以確保您傳遞正確的價值的財產(鑄造後),或在情況下,默認值的情況下不會成功。