自动代码中的无效重新声明生成NSManagedObject子类Swift 3

时间:2016-10-31 22:22:50

标签: ios core-data swift3 nsmanagedobject ios8.1

使用Xcode版本8.1。

在.xcdatamodeld文件中创建一个名为“MapRegionObject”的实体。enter image description here

使用自动代码生成器,单击导航栏上的编辑器 - >创建NSManagedOject子类...

有两个文件:MapRegionObject + CoreDataClass.swift和MapRegionObject + CoreDataProperties

屏幕截图中显示的两个文件中的错误: MapRegionObject + CoreDataClass.swift enter image description here

MapRegionObject + CoreDataProperties enter image description here

请帮我解决这个错误,非常感谢你!

7 个答案:

答案 0 :(得分:123)

在Xcode 8.1中,在使用自动代码生成器之前,必须在数据模型中选择实体:

Entity

然后转到数据模型检查器选项卡:

Data Model Inspector

在“Codegen”下选择“手动/节点”

之后,您可以创建一个NSManagedObject子类而不会出错。

或者,如果您已经使用了“类定义”,则可以进入现有的 .xcdatamodeld 文件,并在Codegen下将所有当前实体设置为“手动/无”。确保保存项目(文件 - >保存),删除现有的派生数据,清理项目,然后构建。为我解决了这个问题,而不必重新制作我的整个模型。

答案 1 :(得分:18)

我发现整件事情非常令人困惑。您确实需要了解CoreData中的新功能。基本上,默认是在名为" DerivedData"的地方自动生成类和扩展名。它隐藏在〜/ Library / Developer / Xcode / DerivedData 中,这些类及其扩展存在于代码源之外。就个人而言,无法打开并看到它们对我来说很奇怪,但有些东西可以用来使用它。

基本上,如果你有一个名为" AppSettings"在您的CoreData模型中,您只需使用它而无需自己生成代码。如果需要项目中的代码,请将实体上的Codegen属性设置为Manual / None。然后执行您之前执行的操作:编辑器 - >创建NSManagedObject类等。文件将在您的项目中结束。

好消息是,如果您想制作自定义扩展程序,只需在项目中执行此操作即可。 Xcode会将生成的文件从项目目录外的其他位置与项目目录中的文件混合。

答案 2 :(得分:3)

问题是您不再需要手动生成NSManagedObjectModel子类。 参考:https://forums.developer.apple.com/thread/48988

  

Xcode自动生成类或类扩展   核心数据数据模型中的实体和属性。自动代码   生成在逐个实体的基础上启用和禁用,和   使用Xcode 8文件为新模型中的所有实体启用   格式。此功能适用于任何已有的数据模型   升级到Xcode 8格式。您指定Xcode是否生成   使用数据模型文件的数据模型的Swift或Objective-C代码   督察。为实体启用自动代码生成时,   Xcode为实体创建类或类扩展   在实体的检查器中指定:使用指定的类名   并将来源放在项目的派生数据中。对彼此而言   Swift和Objective-C,这些类可直接使用   项目的代码。对于Objective-C,将创建一个额外的头文件   对于模型中的所有生成实体:文件名符合   命名约定'DataModelName + CoreDataModel.h'。

答案 3 :(得分:2)

关闭项目并按照以下说明操作:

  1. 在finder中显示您的数据库.xcdatamodeld文件。
  2. on .xcdatamodeld文件右键单击 - >显示包内容,如果再次在包中找到(.xcdatamodel),请右键单击并显示“显示包内容”。你应该得到'内容'文件。
  3. 在文字编辑中打开'内容'。
  4. Command-F(codeGenerationType =“class”)并将所有匹配字符串替换为空字符串。
  5. 再次保存并打开Xcode项目。一切都应该运行良好。

答案 4 :(得分:2)

在Xcode 8.2.1中,菜单 - 产品 - 清洁,一切都很好,它是如此真实。

答案 5 :(得分:1)

除非你真的需要改变你生成的属性,否则不要与Xcode对抗,这样做只会让你感到沮丧。

将自动生成的类视为应用程序中的任何其他类。如果需要向托管对象类添加功能,只需将类定义更改为扩展名并扩展对象即可。

改变你的课程:

class MyManagedObject : NSManagedObject { /* implementation*/ }

扩展名:

extension MyManagedObject { /* implementation */ }

答案 6 :(得分:0)

这不是答案。仅仅是对选择的解释

确保您看到this moment for the Core Data Stanford course

以下是我给自己写的成绩单(并非100%准确):

  

如果选择此默认值,则默认值为class definition。它会   生成该子类,它将正常工作。您将可以访问   您的推文作为“推文”类。听起来不错。顺便说一句,如果你这样做   这将不会显示在文件导航器中

     

我们最常选择的一个是category/extension   这样做只会生成Tweet类的扩展。您   必须实际编写tweet类本身。扩展程序将   制作所有变量。即使我切换到类别/扩展名   再次我没有在导航器中显示该扩展程序。它的   对你来说是隐藏的。

     

为什么我们喜欢这个?因为很多时候我们想添加我们的   自己的代码。就像在Tweet中一样,假设您想添加静态方法   从Twitter收集数据并将其转变为   数据库。我们将代码放在哪里?很好的放置代码的地方   将在Tweet课堂上...如果有这样的事情...   扩展程序将为您处理所有var业务。

     

如果您确实选择了manual/none作为代码生成。意思是什么都不做   codegen,那么您会做value/setValue(forKey:) ...祝您好运   这样,您的代码将变得一团糟。 [即没有   .propertyName = value ...您必须做setValue(value, forKey: propertyName)]。


长话短说,我不确定为什么,但是由于某些原因,如果您不选择 create NSManagedObject子类,那么它似乎仍然有效,但是没有显示幕后情况。非常反感!


然后还观看Core Data Stanford course的现场演示:

  

现在我们知道我们要访问所有不使用的东西   value / set(value:forKey:)...我们想要拥有以下子类   用户/推文。我们希望所有这些都具有vars [点符号]   关系,因此我们需要生成该代码。我们这样做的方式   我们只是选择实体...,然后我们转到CodeGen。这说   默认情况下是类定义。这意味着它已经完成了。它产生了   称为Tweet的课程。并且它将与var和所有   关系。这实际上不是我们想要的。我们要选择   这个[类别/扩展名]。仅在其中创建对Tweet的扩展   并添加var内容。 这是因为我们要编写课程   鸣叫并在其中放置我们自己的代码。写我们的   自己的课。但是您仍然想要变魔术。