获取属性类,提供属性名称

时间:2014-05-09 12:48:16

标签: ios objective-c core-data nsmanagedobject

我需要什么

我有一堆从我的数据模型生成的类,它继承自NSManagedObject。对于任何一个类,我需要一种方法来获取一个属性名称字符串作为键的字典,以及它的字符串类型作为值,对于在数组中传递的每个属性名称。  或者更好,在代码中:

// what I have - generated code
@interface ClassA : NSManagedObject

@property (nonatomic, retain) ClassX *propX;
@property (nonatomic, retain) ClassY *propY;

@end

@implementation ClassA

@dynamic propX;
@dynamic propy;

@end

// what I need
// the method
-(NSDictionary*)dictFromPropNameToPropType:(NSArray*)props {
    //dict being something like @{ @"propX" : @"ClassX", @"propY" : @"ClassY" };
    return dict;
}

// call
dictFromPropNameToPropType(@[@"propX", @"propY"]);

字典创建的逻辑在我身上。我需要一种方法将属性类名称作为字符串获取,并给出它的名称。

我尝试了什么

// a instance method of my ClassA
SEL selector = NSSelectorFromString(propertyNameAsString); // like @"propX"
id object = [self performSelector:selector];
Class class = [object class];
NSString *className = NSStringFromClass(class);

并尝试使用dictionaryWithValuesForKeys,但它似乎使用相同的机制并导致相同类型的错误。

那里没有成功。我得到的是"类,而不是符合关键值的编码兼容"以propertyNameAsString传入的密钥错误,即使我在ClassA中有propX属性

我研究的内容

我查看了有关KVC和KVO的Apple教程,以及关于Runtime的内容(了解@dynamic自动生成属性的内容)。但是我没有自己解决这个问题。

修改

在Martin R的回答中,我得到了这段代码:

NSMutableDictionary *result = [NSMutableDictionary new];
NSEntityDescription *selfEntity = [self entity];
NSDictionary *relationshipsByName = selfEntity.relationshipsByName;
for (NSString *relationDescription in relationshipsByName) {
    NSRelationshipDescription *relationshipDescription = relationshipsByName[relationDescription];
    NSEntityDescription *destinationEntity = relationshipDescription.destinationEntity;
    result[relationDescription] = destinationEntity.managedObjectClassName;
}

1 个答案:

答案 0 :(得分:4)

您拥有NSManagedObject的子类,因此您可以检查对象entity NSEntityDescription

  • 从实体描述中获取propertiesByName,即 以属性名称为键的字典。值为NSAttributeDescriptionNSRelationshipDescription个对象。

  • NSAttributeDescription有一个方法attributeValueClassName,即类 表示属性(作为字符串)。

  • NSRelationshipDescription有一个描述目标的方法destinationEntity 实体并使用managedObjectClassName方法。