我试图从我的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可能是个错误吗?
答案 0 :(得分:66)
我在Xcode 8.1中得到了这个 对我来说,以下步骤解决了这个问题请注意,订单很重要。
1)在核心数据模型中创建实体。
2)在课程部分下,进行如下图所示的设置。
模块:当前产品名称
Codegen:手动/无
3)生成NSManagedObject子类。
答案 1 :(得分:11)
这篇文章帮助我自己解决了这个问题。我个人认为这是一个Xcode错误。虫子与否这是一个巨大的鸡蛋和鸡蛋的情况。
我遇到了这个:
NSManagedObject
子类+扩展名(而codegen: ClassDefinition
)used twice
错误正如其他人发布的那样,我一直在清理我的版本(和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...
(设置手动/无后)。
请注意,在下图中,班级名称“联系人”特定于我的项目。您将看到您的实体名称。
答案 3 :(得分:5)
如果您使用codegen: ClassDefinition
生成了CoreData子类,那么基本上是搞砸了。解决它的唯一方法是:
Codegen: Manual/None
和Module: 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,...来重命名重复项,但保留类名称。而且由于现在实体名称和类名称是"无关",重命名实体也不会改变类名。
希望它有所帮助 - 我也为此提交了一份错误报告。