在使用自动代码生成器之前,必须选择数据模型中的实体:
然后进入“数据模型检查器”选项卡:
在“Codegen”下选择“Manual/None”
然后就可以创建一个NSManagedObject
子类了,这样不会出现错误。
或者,如果您已经使用了“类定义”,则可以进入您现有的.xcdatamodeld文件,并将所有当前实体设置为“Manual/None”下的 Codegen。确保保存项目(文件 -> 保存),删除现有的Derived Data、清理项目,然后编译即可。这样可以解决问题,而无需重新制作整个模型。
我发现整个过程非常令人困惑,您确实需要了解CoreData中的新内容。基本上,默认情况下会在名为“DerivedData”的地方自动生成类和扩展,该文件夹位于~/Library/Developer/Xcode/DerivedData中,这些类及其扩展存在于代码源之外。对我而言,无法打开并查看它们是很奇怪的,但可以逐渐适应。
如果你的CoreData模型中有一个名为“AppSettings”的实体,你可以直接使用它而不需要自己生成代码。如果你想把代码放到你的项目中,那么在实体上设置Codegen属性为Manual/None,然后像之前一样操作:Editor->Create NSManagedObject classes等。文件将会出现在你的项目中。
好消息是,如果你想制作自定义扩展,直接在你的项目中进行即可。Xcode会将从项目目录之外的其他位置生成的文件与你的项目目录中的文件混合在一起。
Xcode会自动生成Core Data数据模型中实体和属性的类或类扩展。自动代码生成可以按实体启用或禁用,并且在使用Xcode 8文件格式创建新模型时会为所有实体启用。此功能适用于已升级到Xcode 8格式的任何数据模型。您可以使用数据模型的文件检查器指定Xcode为数据模型生成Swift或Objective-C代码。当为实体启用自动代码生成时,Xcode将根据实体检查器中指定的类名创建一个类或类扩展,并将源放置在项目的派生数据中。对于Swift和Objective-C,这些类可直接从项目的代码中使用。对于Objective-C,在模型中生成的所有实体都将有一个额外的头文件:文件名符合“DataModelName+CoreDataModel.h”的命名约定。
在Xcode 8.2.1中,选择菜单-产品-清理,一切都很顺利,非常可靠。
关闭项目并按照以下说明操作:
保存并重新打开 Xcode 项目。一切应该正常工作。
除非你真的需要修改生成的属性,否则不要与Xcode争斗,这样做只会让你感到沮丧。
把自动生成的类看作应用程序中的任何其他类。如果您需要向托管对象类添加功能,只需将类定义更改为扩展并扩展您的对象即可。
更改您的类:
class MyManagedObject : NSManagedObject { /* implementation*/ }
作为扩展:
"extension MyManagedObject { /* implementation */ }
这不是一个答案,只是对选择过程的解释。
以下是我自己写的记录(不是100%准确):
默认选项是类定义,如果您选择此选项。它会生成子类并且可以正常工作。您将能够通过名为Tweet的类访问您的推文。这听起来不错。顺便说一句,如果这样做,它不会显示在文件导航器中。NSManagedObject
子类,它似乎仍然可以工作,但是没有展示在后台发生了什么。非常不符合直觉!
现在我们知道我们不想使用value/set(value:forKey:)来访问所有这些内容...我们想要有Users/Tweets的子类。我们想要为所有这些关系都有vars [点符号],所以我们需要生成代码。我们这样做的方式是选择实体...然后我们到CodeGen这里。这默认情况下是类定义。这意味着它已经完成了。它已经生成了一个名为Tweet的类,并且它将与var和所有关系一起工作。那实际上并不是我们想要的。我们想要选择这个[Category/Extension]。只创建一个扩展到Tweet并添加var的内容。这是因为我们想编写Tweet类并在其中放置自己的代码。编写我们自己的类非常常见。但你仍然希望有var魔法。