我需要什么
我有一堆从继承自 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 教程,以及有关运行时的教程(以了解有关 @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;
}
最佳答案
您有 NSManagedObject
的子类,因此您可以检查对象 entity
,即
一个NSEntityDescription
。
从实体描述中获取
propertiesByName
,即 以属性名称作为键的字典。这些值是NSAttributeDescription
或NSRelationshipDescription
对象。NSAttributeDescription
有一个方法attributeValueClassName
,它是类 表示属性(作为字符串)。NSRelationshipDescription
有一个描述目标的方法destinationEntity
实体并具有managementObjectClassName
方法。
关于ios - 获取给出属性名称的属性类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23565073/