使用Swift 3和Xcode 8 beta子类化NSManagedObject

19

我已经开始尝试使用Swift 3和Xcode 8 beta的Core Data。当我尝试从Core Data模型生成NSManagedObject子类并在Editor菜单中选择Create NSManagedObject subclass...选项时,Xcode 8 beta会生成三个文件,其中一个是_COREDATA_DATAMODELNAME_+CoreDataModel.swift,其内容如下:

import Foundation
import CoreData

___COREDATA_DATAMODEL_MANAGEDOBJECTCLASSES_IMPLEMENTATIONS___

此外,该文件的内容显示了两个警告:

Expressions are not allowed at the top level.
Use of unresolved identifier '___COREDATA_DATAMODEL_MANAGEDOBJECTCLASSES_IMPLEMENTATIONS___'

有人遇到过同样的问题吗?这个新文件是什么意思?

谢谢


我无法在Xcode 8 beta中创建自定义的NSManagedObject子类。我遇到了同样的问题。 - Amateur User
我通过以下方式解决了objc的几乎所有问题:https://dev59.com/PlkS5IYBdhLWcg3wlnvg#40788081 - souvickcse
3个回答

44

这可能是与新的自动子类生成冲突(beta版),可以在数据模型文件的实体检查器中进行控制。

来自文档 (Core Data的新特性)

Xcode 自动子类生成

Xcode现在支持建模工具中NSManagedObject子类的自动生成。 在实体检查器中:

  • 手动/无 是默认值和以前的行为; 在这种情况下,您 应该实现自己的子类或使用NSManagedObject
  • 分类/扩展 会在名为ClassName+CoreDataGeneratedProperties的文件中生成一个类扩展。您需要声明/实现 主类(如果是Obj-C,则通过扩展可导入头文件 命名为ClassName.h)。-
  • 类定义 会生成名为 如ClassName+CoreDataClass的子类文件以及为生成的文件 分类/扩展。

生成的文件放置在DerivedData中, 在保存模型后的第一次构建时重新生成。它们也是 被Xcode索引,因此可通过命令单击引用和快速打开文件名来工作。


谢谢。我会在等待Xcode 8的新版本时尝试这三个选项。 - RFG
5
注意:您还可以在文件检查器中选择代码的语言,如果像我一样想要生成Swift,则可以选择。由于这是从测试版升级到GM版的项目迁移,所以我的代码识别语言是Objective C。但无论如何,不会改变项目的语言。 - Adam Carter
什么是实体检查器?-找到答案:这是您编辑实体的地方,即.xcdatamodel文件。 - Ronen

0

我在使用开发版Xcode 8时也遇到了类似的问题。其中一些问题可以通过在离开数据模型或生成NSManagedObject子类之前按下Command + S(保存更改)来解决。我不知道为什么,但在我的情况下,有时自动保存无法正常工作,会出现一些错误。


0

我遇到了上面提到的.swift文件的问题,并发现注释掉___COREDATA...行可以暂时解决错误。我不确定它应该完成什么任务。

我还发现XCODE 8有一个倾向,会忘记添加到CoreData实体中的新字段,并反复将CoreData模型代码生成目标重置为Objective C,导致在重新生成文件时出现大量.h和.m文件而不是swift文件。我看到的大多数问题都与CoreData相关,但到目前为止都可以解决。

除此之外,XCODE 8在处理具有25个数据实体和超过30个视图控制器的应用程序时表现出奇异的稳定性,所以我没有抱怨。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接