2011-07-20 38 views
5

我解析了一些xml,並且我使用新功能非常頻繁地更新服務器。所以,當我添加一個新標籤或其他東西時,我的應用程序會在我調用時解析數據,因爲currentElementValue不屬於我的類。無論如何要檢查一個類是否擁有一個屬性,或者我應該只是捕獲異常提升?如何查看某個類是否有屬性?

[a setValue:currentElementValue forKey:elementName]; 

感謝

回答

8

如果您還沒有覆蓋,你可以使用標準的setter和getter名稱:

if ([object respondsToSelector:@selector(setProp:)]) { 

一個名爲屬性的setter方法 「託」,或者:

if ([object respondsToSelector:@selector(prop)]) { 

其獲取方法。

否則,如果你使用的語法,如:

@property (assign, getter=hasProp) BOOL prop; 

定義的屬性時,使用相應的名稱與上述語法:

if ([object respondsToSelector:@selector(hasProp)]) { 
+2

不總是有效的,因爲屬性可以爲其獲取器和設置器定義不同的方法。 –

+2

@ @property(assign,getter = isOpen)BOOL open;' - 常見模式 – bshirley

+0

@Jonathan Grynspan:謝謝您的評論。我編輯了我的答案,使其更加精確,幷包含了您的洞察力! – sergio

18

很簡單:

if (class_getProperty([object class], "propertyName")) { 
    // it has that property! 
} 
+0

真棒,那麼容易 – Chris

+1

對於iOS,你需要添加'#import '到你的文件 – RunLoop

0

首先你需要大寫你的屬性名稱的第一個字母。

NSString *capitalizedProperty = [NSString stringWithFormat:@"%@%@", [[propertyName substringToIndex:1] uppercaseString], [propertyName substringFromIndex:1]]; 

然後,你需要做的是將設置屬性選擇。 (如果你有一個名爲「富」,那麼屬性默認情況下,這個屬性的setter將被稱爲「setFoo:」。)

SEL propertySetter = NSSelectorFromString([NSString stringWithFormat:@"set%@:",capitalizedProperty]); 

然後像塞爾吉奧的回答,請致電:

if ([object respondsToSelector:propertySetter]) 
{ 
    [object setValue:value forKey:propertyName]; 
} 

檢查this post以查看如何獲取對象的屬性。

相關問題