CoreData对象输入不起作用

时间:2012-09-12 13:15:27

标签: iphone core-data properties nsmanagedobject

有人可以向我解释为什么这不起作用:

CoreDataClass *classObject = (CoreDataClass *)[some method that returns a dictionary with exact KVC pairs that match CoreDataClass];

NSString *myString = classObject.stringProperty;

但这样做:

CoreDataClass *classObject = (CoreDataClass *)[some method that returns a dictionary with exact KVC pairs that match CoreDataClass];
NSString *myString = [classObject valueForKey:@"stringProperty"];

编辑: 将字典强制转换为我的NSManagedObjectClass CoreDataClass的最简单方法是什么,以便我可以直接访问属性?

2 个答案:

答案 0 :(得分:2)

它不起作用,因为KVC合规性根本不是定义类或使它们成为可转换的 - 类层次结构存在是有原因的,并且只是确保遵守某些方法并不会神奇地使某个实例完全不同类。请记住,dot-accessor语法只是方法发送的糖,所以这两个是等价的:

  • classObject.stringProperty
  • [classObject stringProperty]

...后者显然对NSDictionary的实例无效(即[[NSDictionary class] instancesRespondToSelector:@selector(stringProperty)]NO)。

你的后一个例子是有效的,因为你的问题的前提是:如果键stringProperty符合KVC标准,并且你要求它获得该键的值,那么显然你会得到回报。此外,NSDictionary和CoreDataClass都响应选择器-valueForKey:,因此消息发送实际上在运行时工作。

获得两者的最佳方式根本不是“演员” - 它是属性级别所涉及的数据的完全转换。您可以考虑在CoreDataClass上创建一个自定义-initWith...方法,该方法允许您从字典中实例化其属性,或者找到一种方法来使您的方法返回CoreDataClass的实际实例而不是NSDictionary。

请注意,此解决方案可能与获取数据的“最简单”方式不同,这有效地继续执行您正在执行的操作并使用-valueForKey:(尽管最好没有强制转换,这会产生误导)

答案 1 :(得分:1)

的转换对象似乎正常工作(在某种意义上你不会得到类型检查错误),因为它是对编译器的一个提示,但实际上并没有改变任何关于什么的指针指向,所以你仍然指向一个NSDictionary。这是因为,在一天结束时,您实际上是在向指针投射指针,但告诉Xcode您可以向其发送一组不同的选择器。

对于NSManagedObjects,从字典创建取决于一些事项,但推荐的方法是在自定义类上创建一个类方法,它将使用NSEntityDescription和NSManagedObjectContext,并将字典中的属性设置为对象: / p>

+(CoreDataClass *) coreDataObjectWithDictionary:(NSDictionary *) spec {
  CoreDataClass *myInstance = [NSEntityDescription insertNewObjectForEntityForName: @"CoreDataClass" inManagedObjectContext: [myMOCProvider sharedMOC];
  myInstance.someProp = [spec valueForKey:@"someProp"];
}