自动设置 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