我正在解析一些xml,并且我经常使用新功能更新服务器。因此,当我添加新标签或其他内容时,我的应用程序在我调用时解析数据崩溃,因为currentElementValue还不是我的类的一部分。无论如何都要检查一个类是否有属性,还是应该捕获引发的异常?
[a setValue:currentElementValue forKey:elementName];
由于
答案 0 :(得分:19)
很简单:
if (class_getProperty([object class], "propertyName")) {
// it has that property!
}
答案 1 :(得分:8)
如果您没有覆盖标准的setter和getter名称,可以使用:
if ([object respondsToSelector:@selector(setProp:)]) {
表示名为“prop”的属性的setter方法,或者:
if ([object respondsToSelector:@selector(prop)]) {
用于其getter方法。
否则,如果您使用如下语法:
@property (assign, getter=hasProp) BOOL prop;
在定义属性时,请使用具有上述语法的相应名称:
if ([object respondsToSelector:@selector(hasProp)]) {
答案 2 :(得分:0)
首先,您需要将属性名称的第一个字母大写。
NSString *capitalizedProperty = [NSString stringWithFormat:@"%@%@", [[propertyName substringToIndex:1] uppercaseString], [propertyName substringFromIndex:1]];
然后你需要创建一个设置属性的选择器。 (如果你有一个名为“foo”的属性,那么默认情况下,这个属性的setter将被称为“setFoo:”。)
SEL propertySetter = NSSelectorFromString([NSString stringWithFormat:@"set%@:",capitalizedProperty]);
然后就像塞尔吉奥的回答一样,请致电:
if ([object respondsToSelector:propertySetter])
{
[object setValue:value forKey:propertyName];
}
检查this post以了解如何获取对象的属性。