【问题标题】:invalid redeclaration in auto code generate NSManagedObject Subclass Swift 3自动代码中的无效重新声明生成 NSManagedObject 子类 Swift 3
【发布时间】:2017-03-14 01:59:58
【问题描述】:

使用 Xcode 8.1 版。

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

使用自动代码生成器,点击导航栏上的Editor -> create NSManagedOject Subclass...

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

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

MapRegionObject+CoreDataProperties

请帮我修复这个错误,非常感谢!

【问题讨论】:

  • 如果您在实体对象上使用自动代码生成:类定义,则不应创建自己的 NSManagedOject 子类。 XCode 已经在 DerivedData 中为您创建了它。如果您想创建自己的子类,请在您的实体上指定另一个代码生成器。检查此板:stackoverflow.com/questions/37905456/…

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


【解决方案1】:

这不是答案。这只是对选择发生了什么的解释

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

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

默认是class definition,如果你选择这个。它会 生成该子类,它将正常工作。您将能够访问 您的推文作为一个名为 Tweet 的类。这听起来不错。顺便说一句,如果你这样做 这将不会显示在您的文件导航器中

我们最常选择的是category/extension这是什么 这样做只会生成 Tweet 类的扩展。你 必须实际编写推文类本身。延期将采取 关心制作所有的变量。即使我切换到类别/扩展 我没有在导航器中显示该扩展程序。它是 有点对你隐瞒。

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

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


长话短说,我不知道为什么,但出于某种原因,如果您不选择 create NSManagedObject 子类,那么它似乎仍然有效,但 没有 strong> 显示幕后发生的事情。非常反直觉!


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

现在我们知道我们想要访问所有这些不使用的东西 value/set(value:forKey:)...我们想要子类 用户/推文。我们希望所有这些都有 vars [点符号] 关系,所以我们需要生成该代码。我们这样做的方式 我们只需选择实体......然后我们就到 CodeGen。这说 默认类定义。这意味着它已经完成了。它产生了 一个名为 Tweet 的类。它将与 var 和 all 一起使用 关系。这实际上不是我们想要的。我们想选择 这个[类别/扩展名]。仅创建 Tweet 的扩展 并添加 var 的东西。 那是因为我们要编写类 推文并将我们自己的代码放在那里。写我们的很常见 自己的班级。但你仍然想要 var 魔法。

【讨论】:

    【解决方案2】:

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

    然后转到 Data Model Inspector 选项卡:

    在“代码生成”下选择“手动/节点”

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


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

    【讨论】:

    • 如果您已经在“代码生成”下选择了“类定义”创建了您的类并收到此错误,请首先删除您的 .xcdatamodeld 文件并重新创建它。然后在“Codegen”下设置“Manual/None”并使用自动代码生成器。
    • 或者,如果您已经使用过“类定义”,您可以进入现有的 .xcdatamodeld 文件并将所有当前实体设置为 Codegen 下的“手动/无”。确保保存您的项目(文件 -> 保存),删除现有的派生数据,清理项目,然后构建。为我解决了这个问题,而无需重新制作我的整个模型。
    • 它有效!但是,更改 CodeGen 后,请确保保存文件
    【解决方案3】:

    1)清理项目(cmd + shift + K)

    2)在“数据模型检查器”中为每个创建的实体设置属性,就像下面的屏幕截图中一样

    3) 再次生成代码(Editor -> create NSManagedObject Subclasses)

    之后一切正常。

    【讨论】:

      【解决方案4】:

      在 Xcode 8.2.1 中,Menu-Product-Clean,而且一切正常,非常真实。

      【讨论】:

        【解决方案5】:

        除非您真的需要更改生成的属性,否则不要在这方面与 Xcode 争吵,这样做只会让您感到沮丧。

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

        改变你的班级:

        class MyManagedObject : NSManagedObject { /* implementation*/ }
        

        到扩展:

        extension MyManagedObject { /* implementation */ }
        

        【讨论】:

          【解决方案6】:

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

          基本上,如果您的 CoreData 模型中有一个名为“AppSettings”的实体,您可以直接使用它,而无需自己生成代码。如果您想要项目中的代码,则将实体上的 Codegen 属性设置为 Manual/None。然后做你之前做的事情:Editor->Create NSManagedObject classes,等等。这些文件将在你的项目中结束。

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

          【讨论】:

          • 谢谢,得票最多的答案解决了我的问题,但这首先解释了为什么会发生这种情况。现在,我无需担心修复问题,也无需在更改对象时不断地重新生成对象。
          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

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

            1. 在查找器中显示您的数据库 .xcdatamodeld 文件。
            2. 在 .xcdatamodeld 文件上右键单击 -> 显示包内容,如果再次在包中找到 (.xcdatamodel) 再次右键单击并“显示包内容”。你应该得到“内容”文件。
            3. 在文本编辑中打开“内容”。
            4. Command-F (codeGenerationType="class") 并用空白字符串替换所有匹配字符串。

            再次保存并打开 Xcode 项目。一切正常。

            【讨论】:

            • 这不起作用。您的方法背后的任何理由。
            • 同意理由会很有帮助。这对一位同事有用,所以想确切地了解它在做什么。
            【解决方案9】:

            我发现这篇文章对我的问题非常有用。

            What’s new in Core Data Swift 3.0

            How to Use Core Data in iOS 10 (Swift 3)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-03-07
              • 2017-03-12
              • 1970-01-01
              • 1970-01-01
              • 2014-10-18
              • 1970-01-01
              • 2017-10-07
              • 2017-03-17
              相关资源
              最近更新 更多