我的代码中有很多bean / data类,我用它们转换为JSON用于网络通信。问题是,如果我的班级中有NSString
属性,我想将其默认值设置为空字符串 @“”而不是 nil 。我有一个选项是:Setting Default Values For NSString Properties但我必须编写代码来设置属性值,我不想这样做。
我尝试使用Objc运行时获取所有属性,并做了类似这样的事情:
unsigned int numberOfProperties = 0;
objc_property_t *propertyArray = class_copyPropertyList([self class], &numberOfProperties);
for (NSUInteger i = 0; i < numberOfProperties; i++)
{
objc_property_t property = propertyArray[i];
NSString *name = [NSString stringWithUTF8String:property_getName(property)];
const char * propAttr = property_getAttributes(property);
NSString *propString = [NSString stringWithUTF8String:propAttr];
NSArray *attrArray = [propString componentsSeparatedByString:@"\""];
if (attrArray.count > 0) {
NSString *propType = [attrArray objectAtIndex:1];
if ([propType containsString:@"NSString"]) {
[self setValue:@"" forKey:name];
}
}
}
free(propertyArray);
这对我来说就像一个魅力。唯一的问题是我继承了类,这段代码只设置子类的值,它不设置基类中的属性值。我正在使用xcode 6.3.1&amp; iOS 8.x.任何帮助深表感谢。感谢
答案 0 :(得分:1)
您可以在bean / data基类中定义递归方法Base Ctr Derived Ctr Base Ctr Derived copy Ctr Derived Dtr Base Dtr Derived Dtr Base Dtr
,例如setDefaultPropValuesForClass:
,并从基类init方法调用它。请参阅以下实施:
Bean
答案 1 :(得分:0)
你可以通过
检查你的类是否是一个子类 [self class] is SubclassOfClass:
然后获取基础或超级类的属性列表的副本。
objc_property_t *propertyArray = class_copyPropertyList([[self class]superclass], &numberOfProperties);