如何在 objective C iOS 中迭代和设置 class 的 属性

How to iterate and set a property of a class in objective C iOS

我有一个模型 class 对象,它具有以下属性

@property (nonatomic, strong) NSString *place;
@property (nonatomic, strong) NSString *date;

我正在从控制器 class 对象设置这些属性。

我想对我的模型 class 对象属性执行空检查。所以我想像下面这样写一个for循环。

for (property in modelObject)
{   
 if (object  == [NSNull null])//object is a property of modelobject
 {  
   //the next two lines wont be true but need to check that 
   if([property isKindOfClass:[NSString Class]]) property = @"no place";
   if([property isKindOfClass:[NSDate Class]]) property = @"No date;
 }
}

我的问题是,

如果模型 class 对象 属性 设置为空,我如何检查 属性 是否为空以及 属性 的声明类型?

直接检查这两个属性而不是遍历属性不会有帮助,因为在实际场景中,模型有很多不同类型的属性class。

提前致谢。

首先,如果我理解正确的话,你不能这样做来检查 modelObject 视图控制器的属性:

for (property in modelObject)

这样做的目的是遍历一个名为 modelObject 的数组。因此,如果您首先将属性添加到该数组,那会很好。没有简单的方法可以遍历任何 class 具有的每个 属性 - 无论如何你都不想这样做。您首先需要将它们添加到数组中以供引用,或者在其他集合类型中引用它们。

其次,您可以快速检查 属性 是否保持为 nil - 即它从未被使用过,如下所示:

if (object) {
}

如果对象不是 'nil',这将 return 为真。您不必使用 [NSNull null] 来实现您想要实现的目标。所以你可以改为这样做:

if (!place) {
place = @"no place";
}

if (!date) {
date = @"no date";
}

在模型中添加一个方法Class

- (void)nullCheck {
    unsigned int outCount, i;
    objc_property_t *properties = class_copyPropertyList([self class], &outCount);
    for (i = 0; i < outCount; i++) {
        objc_property_t property = properties[i];
        NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property)];
        id propertyValue = [self valueForKey:(NSString *)propertyName]; //check propertyValue here
        //set property value here 
        [self setValue:@"some value" forKey:(NSString *)propertyName];
        const char * type = property_getAttributes(property);
        NSString *attr = [NSString stringWithCString:type encoding:NSUTF8StringEncoding];

        NSString * typeString = [NSString stringWithUTF8String:type];
        NSArray * attributes = [typeString componentsSeparatedByString:@","];
        NSString * typeAttribute = [attributes objectAtIndex:0];
        NSString * propertyType = [typeAttribute substringFromIndex:1];
    }
    free(properties);
}