我使用以下代码迭代对象的所有属性。我已成功检索property name
char
,但我不知道如何获取property value
id
类型的objc_property_t *allProperties = class_copyPropertyList([currentObject class], &allPropertyCount);
for (unsigned int i = 0; i < allPropertyCount; i++) {
objc_property_t property = allProperties[i];
const char * propertyName = property_getName(property);
}
。关于如何实现这一目标的任何想法?
Person
=============================================== =========================================
编辑:谢谢大家的好评和答案。有些人问我为什么需要这个。嗯,原因如下:我有几个同一类的对象。假设该类为mary.age = [NSNumber numberWithInt:20];
john.age = [NSNumber numberWithInt:45];
david.age = [NSNumber numberWithInt:20];
mary.gender = @"female";
john.gender = @"male";
david.gender = @"male";
,其实例为Mary,John和David。每个对象的属性设置如下:
[self groupBaseDataObjects:self.persons withPropertyName:"age"];
我的目的是找到一种泛型方法,根据给定的属性名称Eg对对象进行分组。这将创建2组[david and mary]和[john]:
[self groupBaseDataObjects:self.persons withPropertyName:"gender"];
和此:
{{1}}
还会创建2组[john and david]和[mary]
答案 0 :(得分:5)
好的 - 似乎没有必要做任何时髦的运动员体操来解决你的问题(不要误会我的意思 - 时髦的体操运动会很有趣......但这可能只是浪费时间这里)。
重述问题:
您有一个具有该类的许多实例的类(MyClass)。班级 提供了几个具有许多类的实例的属性 该属性的不同值。你有一个集合 实例,您希望轻松获取多个子集的集合 其中每个子集中的对象具有相同的特定值 属性。
为此,我只是循环原始问题并执行类似的操作(此代码从未见过编译器;它可能无法编译):
// implement this on MyClass
+ (NSDictionary*)subdivideArrayOfMyClass:(NSArray*) aCollection byAttribute:(NSString*) anAttribute
{
NSMutableDictionary *collector = [NSMutableDictionary dictionary];
for (MyClass *anObject in aCollection) {
id value = [anObject valueForKey: anAttribute];
// you'd have to special case for nil here if you wanted.
NSMutableArray *sameValueCollector = [collector objectForKey: value];
if (!sameValueCollector) {
sameValueCollector = [NSMutableArray array];
[collector setObject: sameValueCollector forKey:value];
}
[sameValueCollector addObject:anObject];
}
return collector; // no need to turn it into an immutable dict
}
这确实假设所有值都可以安全地用作字典中的键。对于你给出的例子,情况确实如此。
如果您需要具有单个值的所有对象,则可以在数组上执行valueForKey :.如果你愿意,你可以做一些时髦的设置算法来细分对象。但是,这可能会在集合上产生多次传递,而上面的工作只需要一次传递(尽管收集器中可能存在大量的哈希查找)。直截了当,直到性能分析表明它太慢。
答案 1 :(得分:3)
使用valueForKey:
。
id object = [customObject valueForKey:[NSString stringWithUTF8String:propertyName]];
您可以使用isEqual:
进行比较。您将在适当的时候获得NSNumber
或NSValue
。阅读KVC指南了解更多信息。
早期答案
<击>
由于getter方法将匹配属性名称,因此您可以生成属性名称的选择器并在对象上调用performSelector
。
[customObject performSelector:NSSelectorFromString([NSString stringWithUTF8String:propertyName])];
击> <击> 撞击>