【问题标题】:Core Data Codegen fail in Xcode 8Xcode 8 中的核心数据代码生成失败
【发布时间】:2016-12-18 07:30:53
【问题描述】:

我有一个 iOS 应用,其中包含一个包含 6 个实体的核心数据模型。实体Name设置如下:

类名:名称

模块:当前产品模块

可待因:类定义

(所有其他 5 个实体的设置都类似)。

问题 1(已解决但留给后代)

在派生数据文件夹中生成的代码......不像预期的那样作为〜类定义,而是作为扩展名(命名为Name+CoreDataProperties.swift。Codegen 设置为类定义或类别/扩展似乎并不重要- 我仍然得到相同的结果。

好吧,保持这个想法——突然之间,类文件和扩展文件都在生成了……看起来你需要删除项目的派生数据文件夹并在两次更新之间重新启动 Xcode。忽略问题 1

问题 2

生成的文件忽略字符串属性和关系的数据模型 Optional 标志设置 - 它们都是作为可选项生成的

问题 3(已解决但留给后代)

有序关系生成为OrderedSet(和一个编译错误)而不是NSOrderedSet(在重新生成时无法更改它们)

对我来说,解决方法是暂时添加到项目中…… public typealias OrderedSet = NSOrderedSet

好的,现在编译器错误消失了,OrderedSet 似乎被识别出来了。忽略问题 3。

问题 4

以上都不重要,因为编译器找不到它刚刚生成的文件。对于上面的Name 实体:

:0: 错误:没有这样的文件或目录: '/Users/ashleymills/Library/Developer/Xcode/DerivedData/-grfqveelvqtlydbpwjmfdietnrss/Build/Intermediates/.build/Debug-iphonesimulator/.build/DerivedSources/CoreDataGenerated//.Name+CoreDataClass.swift' :0: 错误:没有这样的文件或目录: '/Users/ashleymills/Library/Developer/Xcode/DerivedData/-grfqveelvqtlydbpwjmfdietnrss/Build/Intermediates/.build/Debug-iphonesimulator/.build/DerivedSources/CoreDataGenerated//.Name+CoreDataProperties.swift'

它正在查找文件 .Name+CoreDataClass.swift.Name+CoreDataProperties.swift 的派生数据 - 请注意“.”在文件名的前面。 (作为临时修复,我将生成的文件添加到项目中)

我认为我做错了什么,好像每个人都是这样,没有人能够构建 Core Data 项目……或者这些错误需要提高吗?

干杯 灰

(也在 Apple 开发者论坛上提出)

【问题讨论】:

  • 我在我的一个项目中遇到了同样的问题 4,您是否解决了这个问题或仍在使用解决方法?您在 Apple 开发者论坛上是否有指向同一问题的链接?

标签: core-data swift3 ios10


【解决方案1】:

关于问题 1,在 Inspector 中为 .xcdatamodel 中的实体设置 Codegen 弹出窗口应该像这样工作:

Category/Extension告诉Xcode生成一个文件,ClassName+CoreDataGeneratedProperties。

类定义告诉Xcode生成两个文件,上面提到的文件,加上ClassName+CoreDataClass。

但是,Xcode 8.2 中似乎存在一个错误。如果在更改这些弹出窗口之一后,您只是构建 (⌘B) 或运行 (⌘R),您的更改将不会生效。例如,如果您从 Class Definition 更改为 Category/Extension 甚至手动删除了第二个文件,它会重新出现。您甚至可能会发现弹出窗口恢复为原始设置。

为了使这些弹出窗口中的更改生效,您必须

  1. 保存 (⌘S) .xcdatamodel 文件。
  2. 关闭所有项目窗口。
  3. 重新打开项目。

在下一次构建期间(如果您在情节提要中有@IBInspectable,项目打开时可能会自动发生),将生成或删除派生数据中受影响的文件以符合您的新设置。

2016-12-22 更新:感谢您的评论,阿什利。我现在已经写好并提交给 Apple Bug Reporter:29789727。2017-02-08 更新:Apple 已关闭 29789727,因为它据称与 21205277 重复。

【讨论】:

  • 是的 - 这是自 8.0 以来一直存在的。我通常最终编辑 .xcdatamodel 内容的原始 xml
  • 当我选择“类定义”时,我在哪里可以找到扩展文件,以便我可以添加自己的方法,包括处理瞬态属性
  • @Satyam,这是一个很好的问题,但与这个问题无关。此外,答案太长太复杂,无法发表评论。请作为一个新问题提出。
  • 文件名和导入语句错误,一团糟!
【解决方案2】:

可以通过选择您想要自动生成的所有实体,然后在检查器中清除 Class -> Module 字段,使其默认为“Global命名空间”。

【讨论】:

    【解决方案3】:

    关于问题 2:Core Data 的“可选”标志与 Swift 的可选项概念无关。它们是不相关的,并不意味着同样的事情。将 Core Data 属性标记为非可选并不意味着它是非可选的,因为 Swift 定义了该术语。区别在于:

    • Swift 非可选项在任何时候都必须具有非 nil 值
    • Core Data 非可选值必须具有非 nil 值保存更改时,但 Core Data 既不知道也不关心它们在其他时间是否为 nil。

    问题 #4 听起来 Xcode 的状态很混乱,并且可以通过 voodoo 修复,例如手动清除派生数据文件夹(我知道)。我目前无法重现它,但这并不意味着它不是当前测试版中的错误。

    【讨论】:

    • 我了解 Core Data 和 Swift 的 optional 之间的区别,但我不明白为什么不将具有默认值的非可选属性生成为具有默认值的非可选属性.. . 它仍然是 Swift 可选的。那么,当我们知道它们具有价值时,我们应该如何处理它们呢? (因为非可选 + Core Data 的默认值)。我们是否应该在每个使用托管对象属性检查值是否为 nil 的方法中保护自己?
    • 我同意,并建议向 Apple 提交错误。现在,要么 (a) 将属性更改为 Swift 非可选属性,要么 (b) 将其视为 Swift 可选属性,即使你知道有一个值。我知道,两者都不理想。
    • 关于 (a),我正在为 NSManagedObjects 使用 Xcode 8 自动子类生成。所以我对生成的临时类和扩展没有任何控制:默认情况下它是可选的并且不能改变它(据我所知)......所以我现在会坚持使用(b)并考虑填充Apple 的一个错误。
    【解决方案4】:

    实际上很容易修复它。

    进入配置:

    然后删除点。这些仅存在于较旧的项目中。 在此之后导入语句已修复,您可以开始了。

    您还应该将模型放入全局命名空间。我的在一个额外的命名空间中,但我不知道为什么。

    Apple 的方法是您可以在自定义框架中使用它。

    这个功能很不错,如果你能用的话;)

    【讨论】:

      【解决方案5】:

      看起来 Xcode 8.2.1 不会关闭 codegen。 但是您可以从 .xcdatamodel 内容文件中手动删除codeGenerationType="category"

      关闭 Xcode,删除 codeGenerationType,删除 DerivedData 文件夹并重建。

      将等待未来版本中的修复。

      【讨论】:

        【解决方案6】:

        我完全被 问题 4 困住了,以上方法都不适合我。我使用代码生成。为了解决它,我执行了以下步骤:

        1. 我在文本编辑器中打开了 .xcdatamodel / 内容文件。 (在 Xcode 中右键单击您的 .xcdatamodel 并选择“在外部编辑器中打开”
        2. 在 XML 文件中,我确保每个实体都有 codeGenerationType="class"
        3. 关闭并重新打开 Xcode 清除了我的派生数据文件夹
        4. 它仍然拒绝进行代码生成,所以我随后手动生成了每个实体(编辑器,创建 NSManageObject 子类,选择所有实体)
        5. 构建项目。现在它也做了代码生成和编译器错误出现,说实体文件名被使用了两次。
        6. 删除了在第 5 步中创建的手动创建的 NSManagedObject 子类。
        7. 之后项目再次构建成功,问题就消失了。

        PS:如果您选择手动创建 NSManageObject 子类而不是使用代码生成,请确保在步骤 2 中从 XML 文件中的实体中删除 codeGenerationType="class"

        【讨论】:

          猜你喜欢
          • 2017-04-29
          • 2011-07-16
          • 1970-01-01
          • 2016-10-28
          • 2015-11-20
          • 2021-07-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多