自动设置 NSString 属性的默认值
Set Default values of NSString properties automatically
我的代码中有很多 bean/data classes,我将它们转换为 JSON 用于网络通信目的。问题是,如果我的 class 中有一个 NSString
属性 我想将其默认值设置为空字符串 @""" 而不是 无。我有一个选择是: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);
这对我来说就像一个魅力。唯一的问题是我继承了 classes 并且这段代码只设置了子 class 的值,它没有设置基础 class 中的属性值。我正在使用 xcode 6.3.1 & iOS 8.x。任何帮助深表感谢。谢谢
你能检查一下你的 class 是不是 class by
的子class
[self class] is SubclassOfClass:
然后获取 属性 基本列表或超级列表的副本 class。
objc_property_t *propertyArray = class_copyPropertyList([[self class]superclass], &numberOfProperties);
您可以在 bean/data 基 class 中定义递归方法 setDefaultPropValuesForClass:
,例如Bean
,并从基础 class init 方法中调用它。请参阅下面的实现:
@interface Bean : NSObject
// Add your props
// ...
// .....
@end
@implementation Bean
- (instancetype)init {
self = [super init];
if (self) {
[self setDefaultPropValues];
// TODO: All other initializations
}
return self;
}
- (void)setDefaultPropValues {
[self setDefaultPropValuesForClass:self.class];
}
- (void)setDefaultPropValuesForClass:(Class)refClass {
if (![refClass isSubclassOfClass:[Bean class]]) {
return;
}
// First set default property values in super classes
Class baseClass = class_getSuperclass(refClass);
[self setDefaultPropValuesForClass:baseClass];
//
unsigned int numberOfProperties = 0;
objc_property_t *propertyArray = class_copyPropertyList(refClass, &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 *allAttrs = [propString componentsSeparatedByString:@","];
// Check if property is readonly
if (NSNotFound == [allAttrs indexOfObject:@"R"]) {
// Find Property type token
NSArray * attrArray = [propString componentsSeparatedByString:@"\""];
if (attrArray.count > 1) {
Class propType = NSClassFromString([attrArray objectAtIndex:1]);
if ([propType isSubclassOfClass:[NSString class]]) {
[self setValue:@"" forKey:name];
}
}
}
}
free(propertyArray);
}
@end
我的代码中有很多 bean/data classes,我将它们转换为 JSON 用于网络通信目的。问题是,如果我的 class 中有一个 NSString
属性 我想将其默认值设置为空字符串 @""" 而不是 无。我有一个选择是: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);
这对我来说就像一个魅力。唯一的问题是我继承了 classes 并且这段代码只设置了子 class 的值,它没有设置基础 class 中的属性值。我正在使用 xcode 6.3.1 & iOS 8.x。任何帮助深表感谢。谢谢
你能检查一下你的 class 是不是 class by
的子class[self class] is SubclassOfClass:
然后获取 属性 基本列表或超级列表的副本 class。
objc_property_t *propertyArray = class_copyPropertyList([[self class]superclass], &numberOfProperties);
您可以在 bean/data 基 class 中定义递归方法 setDefaultPropValuesForClass:
,例如Bean
,并从基础 class init 方法中调用它。请参阅下面的实现:
@interface Bean : NSObject
// Add your props
// ...
// .....
@end
@implementation Bean
- (instancetype)init {
self = [super init];
if (self) {
[self setDefaultPropValues];
// TODO: All other initializations
}
return self;
}
- (void)setDefaultPropValues {
[self setDefaultPropValuesForClass:self.class];
}
- (void)setDefaultPropValuesForClass:(Class)refClass {
if (![refClass isSubclassOfClass:[Bean class]]) {
return;
}
// First set default property values in super classes
Class baseClass = class_getSuperclass(refClass);
[self setDefaultPropValuesForClass:baseClass];
//
unsigned int numberOfProperties = 0;
objc_property_t *propertyArray = class_copyPropertyList(refClass, &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 *allAttrs = [propString componentsSeparatedByString:@","];
// Check if property is readonly
if (NSNotFound == [allAttrs indexOfObject:@"R"]) {
// Find Property type token
NSArray * attrArray = [propString componentsSeparatedByString:@"\""];
if (attrArray.count > 1) {
Class propType = NSClassFromString([attrArray objectAtIndex:1]);
if ([propType isSubclassOfClass:[NSString class]]) {
[self setValue:@"" forKey:name];
}
}
}
}
free(propertyArray);
}
@end