问题
在Xcode 升级到 8 以上的版本后,可视界面创建CoreData模型.xcdatamodeld
后使用Editor->Create NSManagedObject Subclass后会发生编译错误 : duplicate error
错误原因:
Xcode8.0中包含了一个自动生成NSManagedObject的机制,如果你打开该机制则会在project(Derived Data目录中)实际生成的DerivedSources文件夹中出现同名的源代码文件。
也就是说 就算你不新建这个类的文件,编译器已经是会有这个文件的了(所以可以直接在你的代码直接调用.xcdatamodeld
中定义的entity,而无需创建文件)
个人看法:
此功能有好有坏:
好的方面:在代码编码的角度来看,数据库的entity应该独立出来管理,与entity相关的东西都不应该写在entity的类中,如果遵循这种编码思想来编码的话,无疑这个功能会使我们少做创建类的步骤
坏的方面:开源的很多开源coredata工具库都会让开发者在entity类中实现类似
+(NSString *)primaryKey
等方法来定制每一种entity的功能、属性、用法等。
解决问题
- 如果是原本就进行逻辑隔离或没有使用任何的库:
删掉创建的类,直接在你想调用的地方直接打出Entity的名称,你会发现会有提示(的确是很方便的功能)
*如果引用了库或想在类中添加逻辑方法:
1 . 打开你的.xcdatamodeld
文件
2 . 选中你的entity,修改tools version为7.3(顺带提醒language不要错了),修改codegen
3 .然后就可以按照xcode8之前的做法一样,创建一个类,而且这个时候并不会duplicate error了
PS
**由于xcode抽风,上面修改的东西有可能不能真实被保存,如果修改后依然有问题,请试试以下操作 : **
- Xcode的顶部选项 -> File -> save
- Xcode的顶部选项 -> Product -> clean
- 重启Xcode查看修改是否真正被应用