如何在 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);
}
我有一个模型 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);
}