使用CoreData生成器在DerivedData文件夹中复制文件

时间:2016-07-04 18:18:46

标签: core-data swift3 xcode8

我试图从我的datamodel生成NSManagedModel。生成有效,但在我遇到很多错误之后:

  

错误:文件名" Station + CoreDataProperties.swift"使用了两次:   ' /Users/Me/MyApp/Models/CoreData/Station+CoreDataProperties.swift'和   ' /Users/Me/Library/Developer/Xcode/DerivedData/MyApp-gwacspwrsnabomertjnqfbuhjvwc/Build/Intermediates/MyApp.build/Debug-iphoneos/MyApp.build/DerivedSources/CoreDataGenerated/Model/Station+CoreDataProperties.swift' ;   :0:注意:文件名用于区分私有   具有相同名称的声明

我尝试清理构建文件夹和derivedData目录硬删除。我使用Xcode 8 BETA可能是个错误吗?

7 个答案:

答案 0 :(得分:66)

我在Xcode 8.1中得到了这个 对我来说,以下步骤解决了这个问题请注意,订单很重要。

1)在核心数据模型中创建实体。

2)在课程部分下,进行如下图所示的设置。

模块:当前产品名称

Codegen:手动/无

3)生成NSManagedObject子类。

Error Message in Visual Studio

答案 1 :(得分:11)

这篇文章帮助我自己解决了这个问题。我个人认为这是一个Xcode错误。虫子与否这是一个巨大的鸡蛋和鸡蛋的情况。

我遇到了这个:

  1. 使用核心数据创建新项目
  2. 生成我的NSManagedObject子类+扩展名(而codegen: ClassDefinition
  3. 我不小心将生成的类保存在错误的文件夹中
  4. 我删除了生成的文件
  5. 在我想要的文件夹中重新生成
  6. - Xcode used twice错误
  7. 正如其他人发布的那样,我一直在清理我的版本(和clean build folder),但这从未解决构建问题。

    我终于弄清楚你是否最初使用NSManagedObject创建了codegen: ClassDefinition生成的类,因为我不知道你是否因为鸡和鸡蛋问题而被锁定。

    然后我删除了自动生成的类思考我必须重新生成,所以我做了。重新生成后,我会再次遇到used twice构建错误。我手动进入../DerivedSources/CoreDataGenerated/Model/..并删除了重复项。再次,我重新思考我只有一份(在我的项目中),但我错了。如果最初设置了codegen: ClassDefinition,那么Xcode将继续创建auto-generated类+扩展,并将它们放在隐藏文件夹../DerivedSources/CoreDataGenerated/Model/..中。我重复了这个鸡蛋和鸡蛋几次,然后继续前进。

    我后来意识到你确实需要标记codegen: Manual/None然而要让事情恢复同步,你需要删除../DerivedSources/CoreDataGenerated/Model/..和项目中自动生成的文件,如果你还有。

    小心设置codegen: Manual/None,对我而言有点棘手,因为codegen: Manual/None不会坚持。我不得不多次在实体之间来回点击以进行双/三检查,每个实体都设置为codegen: Manual/None然后自动生成文件。此时,您自动生成的文件的唯一副本应该在您的项目中,而不是../DerivedSources/CoreDataGenerated/Model/..

    最后,我认为这是一个错误,因为如果你指定codegen: Manual/None我根本不希望Xcode自动生成文件,但它会将它们放在你的项目中。如果您的设置为codegen: ClassDefinition会更加令人困惑,他知道Xcode会将文件放在隐藏目录中,但它可以在您的项目中使用。我的牛肉是自动生成的文件不受源控制,如果我更换电脑,我必须知道在新电台自动生成它们。

    希望这有助于其他人!

    干杯!

答案 2 :(得分:8)

这确实不是一个错误。由于@Morrowless建议创建类定义和属性扩展。如果不需要,请在生成代码之前选择手动/无。如果代码已经生成,只需删除它们,然后再次从菜单中尝试Editor->Create NSManagedObject Subclass...(设置手动/无后)。

请注意,在下图中,班级名称“联系人”特定于我的项目。您将看到您的实体名称。

enter image description here

答案 3 :(得分:5)

如果您使用codegen: ClassDefinition生成了CoreData子类,那么基本上是搞砸了。解决它的唯一方法是:

  1. 删除您的CoreData子类。
  2. 删除您的派生数据文件夹。
  3. 清理您的项目(CMD + K)。
  4. 生成新的CoreData子类,这次选择Codegen: Manual/NoneModule: Current Product Module

答案 4 :(得分:3)

这不是错误。 Codegen在DerivedData文件夹中生成这些文件,因此您不需要在项目中再次创建它们,因此编译错误。

来自Xcode 8.0发行说明:

  

Xcode自动为Core Data数据模型中的实体和属性生成类或类扩展。在逐个实体的基础上启用和禁用自动代码生成,并为使用Xcode 8文件格式的新模型中的所有实体启用自动代码生成。此功能适用于已升级为Xcode 8格式的任何数据模型。您可以使用数据模型的文件检查器指定Xcode是否为数据模型生成Swift或Objective-C代码。

     

当为实体启用自动代码生成时,Xcode会创建   要么是在实体中指定的实体的类扩展,要么是类扩展   实体的检查员:使用指定的类名和来源   放在项目的派生数据中。对于Swift和   Objective-C,这些类可直接从项目中使用   码。对于Objective-C,将为所有人创建一个额外的头文件   在模型中生成实体。头文件名符合   命名约定“DataModelName + CoreDataModel.h”。

但是,如果您在数据模型检查器的codegen下拉菜单中选择了类别/扩展名(因为您想为模型添加逻辑): codegen将错误地生成这两个类定义和属性扩展

解决方案是简单地删除属性扩展( ClassName + CoreDataProperties.swift)。您的项目现在应该编译。

答案 5 :(得分:0)

按照oyalhi和Vladimir Shutyuk的指导(删除import java.util.Scanner; public class Sundae { public static final double TAX = 0.08625; private String icecream; private int scoops; private double scoopCost; private String toppings; private String allChoices; private String deluxeToppings; private int counter = 0; private double costOfDeluxeToppings = 0; private double costOfSundae = 0; Scanner input = new Scanner(System.in); public String iceCreamFlavor() { System.out.println("1. vanilla | 2. peanut butter | 3. chocolate " + "| 4. mint chocolate chip |\n 5. coffee | 6. strawberry | 7. raspberry " + "| 8. knickerbocker glory | 9. cookies and creme"); int flavor = input.nextInt(); switch(flavor) { case 1: icecream = "vanilla"; break; case 2: icecream = "peanut butter"; break; case 3: icecream = "chocolate"; break; case 4: icecream = "mint chocolate chip"; break; case 5: icecream = "coffe"; break; case 6: icecream = "strawberry"; break; case 7: icecream = "raspberry"; break; case 8: icecream = "knickerbocker glory"; break; case 9: icecream = "cookies and cream"; break; default: icecream = "vanilla"; } return icecream; } public int numberOfScoops() { scoops = input.nextInt(); switch(scoops) { case 1: scoops = 1; break; case 2: scoops = 2; break; case 3: scoops = 3; break; case 4: scoops = 4; break; case 5: scoops = 5; break; case 6: scoops = 6; break; default: scoops = 2; } return scoops; } public double costForScoops() { switch(scoops) { case 1: System.out.println("1 scoop cost $1.79"); scoopCost = 1.79; break; case 2: System.out.println("2 scoops cost $2.79"); scoopCost = 2.79; break; case 3: System.out.println("3 scoops cost $3.79"); scoopCost = 3.79; break; case 4: System.out.println("4 scoops cost $4.79"); scoopCost = 4.79; break; case 5: System.out.println("5 scoops cost $5.79"); scoopCost = 5.79; break; case 6: System.out.println("6 scoops cost $6.79"); scoopCost = 6.79; break; default: System.out.println("2 scoops cost $2.79"); scoopCost = 2.79; break; } return scoopCost; } public String standardToppingList() { System.out.println("1. whipped cream | 2. syrup | 3. chocolate sprinkes " + "| 4. rainbow sprinkes | 5. cherry"); String choice1 = ""; String choice2 = ""; String choice3 = ""; String choice4 = ""; String choice5 = ""; int choice = 0; while(choice != -1) { choice = input.nextInt(); switch(choice) { case 1: choice1 = "whipped cream, "; System.out.println(choice1); break; case 2: choice2 = "syrup, "; System.out.println(choice2); break; case 3: choice3 = "choclate sprinkles, "; System.out.println(choice3); break; case 4: choice4 = "rainbow sprinkles, "; System.out.println(choice4); break; case 5: choice5 = "cherry, "; System.out.println(choice5); break; case -1: break; default: choice = -1; choice1 = "whipped cream, "; choice2 = "syrup, "; choice3 = "choclate sprinkles, "; choice4 = "rainbow sprinkles, "; choice5 = "cherry, "; break; } } toppings = choice1 + choice2 + choice3 + choice4 + choice5; System.out.println("Your choices of toppings are: " + toppings); return toppings; } public String freeSyrupChoice() { System.out.println("1. hot fudge | 2. chocolate | 3. caramel | 4. strawberry"); int choice = 0; String choice1 = ""; String choice2 = ""; String choice3 = ""; String choice4 = ""; while(choice != -1) { choice = input.nextInt(); switch(choice) { case 1: choice1 = "hot fudge, "; System.out.println(choice1); break; case 2: choice2 = "chocolate, "; System.out.println(choice2); break; case 3: choice3 = "caramel, "; System.out.println(choice3); break; case 4: choice4 = "strawberry, "; System.out.println(choice4); break; case -1: break; default: choice = -1; choice1 = "hot fudge, "; break; } } allChoices = choice1 + choice2 + choice3 + choice4; System.out.println("Your choices of syrup include " + allChoices); return allChoices; } public String deluxeToppingList() { System.out.println("1. M&Ms | 2. Crushed Oreos | 3. Reeses | 4. Brownie Crunchies" + " | 5. Brownie Crunchies | 6. Kit Kats \n| 7. Marshmallow | 8. Granola clusters" + " | 9. Peanuts | 10. Walnuts"); String choice1 = ""; String choice2 = ""; String choice3 = ""; String choice4 = ""; String choice5 = ""; String choice6 = ""; String choice7 = ""; String choice8 = ""; int choice = 0; while(choice != -1) { choice = input.nextInt(); switch(choice) { case 1: choice1 = "M&M's, "; System.out.println(choice1); counter++; break; case 2: choice2 = "Crushed Oreos, "; System.out.println(choice2); counter++; break; case 3: choice3 = "Reeses, "; System.out.println(choice3); counter++; break; case 4: choice4 = "Brownie Crunchies, "; System.out.println(choice4); counter++; break; case 5: choice5 = "Kit Kats, "; System.out.println(choice5); counter++; break; case 6: choice6 = "Granola Clusters, "; System.out.println(choice6); counter++; break; case 7: choice7 = "Peanuts, "; System.out.println(choice7); counter++; break; case 8: choice8 = "Walnuts, "; System.out.println(choice8); counter++; break; case -1: break; default: choice = -1; break; } } deluxeToppings = choice1 + choice2 + choice3 + choice4 + choice5 + choice6 + choice7 + choice8; System.out.println("Your choices of deluxe toppings are: " + deluxeToppings); return deluxeToppings; } public int counterD() { System.out.println("You got " + counter + " deluxe toppings"); return counter; } public double costOfDeluxeToppings() { costOfDeluxeToppings = counter * 1.25; System.out.printf("%s%.2f%s" , "Each deluxe topping cost $1.25 each ", costOfDeluxeToppings, " will be added to your total."); return costOfDeluxeToppings; } public double costOfSundae() { costOfSundae = scoopCost + costOfDeluxeToppings; return costOfSundae; } public void outputOrder() { System.out.println("Your order consists of " + scoops + " scoop/s of " + icecream + " icecream with " + toppings + allChoices + deluxeToppings); System.out.printf("%s%.2f\n" , "Your sub-total is: $" , costOfSundae); double tax = costOfSundae * TAX; System.out.println("+ 8.625%"); double total = costOfSundae + tax; System.out.printf("%s%.2f" , "Your total is: $" , total); } } 文件,将实体NSManagedObject更改为codegen)后,我不得不重新启动Xcode以允许它再次编入索引在我重新生成Manual/None文件并获得成功编译之前。

答案 6 :(得分:0)

为了完整起见..:

我遇到了同样的错误,但提议的解决方案都没有奏效。令我感到困惑的是,即使从自动代码生成切换到手动(我认为)有问题的实体也没有做任何事情。

最后,我发现我有几个具有相同名称的实体,但它们都共享相同的 classname 。这样做的原因是我多次复制和粘贴一个实体以节省一些工作,因为它们也有一些共同的属性。

结果XCode通过向实体名称添加1,2,...来重命名重复项,但保留类名称。而且由于现在实体名称和类名称是"无关",重命名实体也不会改变类名。

希望它有所帮助 - 我也为此提交了一份错误报告。