Ich habe versucht, Kerndaten hinzuzufügen ... und jedes Mal, wenn ich die gleiche Fehlermeldung erhielt:
error: filename "EntityName +CoreDataClass.Swift" used twice: '/Users/userName/Desktop/Development/MyApp/AppName/EntityName +CoreDataClass.Swift' and '/Users/userName/Library/Developer/Xcode/DerivedData/AppName-dgwzrmxsetzvtedibxrazuutjwnh/Build/Intermediates/AppName.build/Debug-iphoneos/AppName.build/DerivedSources/CoreDataGenerated/Model/EntityName +CoreDataClass.Swift'
Ich füge Kerndaten mit den folgenden Schritten hinzu:
1.Neue Datei/DataModel; Speichern Sie es im Stammverzeichnis Ihres Projekts
Wählen Sie Model.xcdatamodeld aus und fügen Sie eine Entität hinzu, fügen Sie mehrere Attribute hinzu, speichern Sie editor/erstellen Sie die Unterklasse NSManagedObjectClass.
Als Ergebnis beobachte ich 4 neue Dateien im Navigator: Model.xcdatamodeld, EntityName + CoreDataProperties.Swift, EntityName + CoreDataClass.Swift,COREDATA_DATAMODELNAME+ CoreDataModel.Swift
ihr Inhalt: COREDATA_DATAMODELNAME+ CoreDataModel.Swift:
import Foundation
import CoreData
___COREDATA_DATAMODEL_MANAGEDOBJECTCLASSES_IMPLEMENTATIONS___
EntityName + CoreDataClass.Swift:
import Foundation
import CoreData
class EntityName: NSManagedObject {
}
EntityName + CoreDataProperties.Swift:
import Foundation
import CoreData
extension EntityName {
@nonobjc class func fetchRequest() -> NSFetchRequest< EntityName > {
return NSFetchRequest< EntityName >(entityName: "EntityName");
}
@NSManaged var str: String?
}
Was ich versucht habe:
1. Bereinigen Sie den Build, entfernen Sie DerivedData, löschen Sie den Inhalt von var/ordnern, und starten Sie ihn erneut
2. Löschen Sie die generierten Dateien, die im Navigator angezeigt werden
Alle meine Bemühungen hatten kein Glück.
Was mache ich falsch?
Xcode 8 enthält eine automatische NSManagedObject
-Klassengenerierung, wenn die Modelldatei das Xcode 8-Dateiformat verwendet. Wenn Sie eigene Unterklassendateien erstellen, erstellen Sie Duplikate. Die zweite Datei in der Fehlermeldung in DerivedSources
ist die Datei, die Xcode automatisch erstellt hat.
Wenn die automatisch generierten Dateien das tun, was Sie brauchen, hören Sie einfach auf, Ihre eigenen zu erstellen, und Sie sind in Ordnung.
Wenn Sie stattdessen eigene Unterklassen erstellen möchten, können Sie dies tun
In XCode 8 gibt es zwei Fehler:
1 - Wenn Sie die Codegen-Dropdown-Liste ändern, wird der neue Wert nicht in Model.xcdatamodel gespeichert. Sie müssen etwas anderes ändern, damit es gespeichert wird. Ändern Sie beispielsweise den Klassennamen. bauen; Ändern Sie den Klassennamen zurück. wieder bauen.
2 - Der generierte Code wird in DerivedData im Ordner Intermediates abgelegt. Dies geschieht jedoch nur, wenn der Ordner noch nicht vorhanden ist. Die Problemumgehung besteht darin, einen Clean und dann einen Build durchzuführen.
Ich habe tatsächlich das gleiche Problem (mit Swift) und vermute, dass es sich um einen Fehler handelt. Wenn ich es richtig verstanden habe, verwendet das OP die autogenen NSManagedObject-Unterklassen von Xcode und erstellt dann keine weiteren (überflüssigen) Unterklassen, was zu Verwirrung führen kann.
Schritte zum Reproduzieren:
Erstellen Sie ein neues Projekt mit Einzelansicht. Kreuzen Sie "Use Core Data" an
Erstellen Sie eine Entität in der Modellentität, fügen Sie Eigenschaften hinzu, und stellen Sie sicher, dass die Datei .__ ist. gespeichert (manchmal wirft Xcode 8 Beta die Daten ab, wenn nicht explizit gespeichert wurde)
Xcode erstellt 3 Dateien:
COREDATA_DATAMODELNAME_ + CoreDataModel.Swift. Diese Datei ist Beschädigt und enthält nicht gültige Einträge nach den Anweisungen von Import Foundation und CoreData. Das Projekt wird nur dann kompiliert, wenn Diese Datei gelöscht wird
import Foundation
import CoreData
___COREDATA_DATAMODEL_MANAGEDOBJECTCLASSES_IMPLEMENTATIONS___
EntityName + CoreDataClass.Swift
EntityName + CoreDataProperties.Swift
Obwohl der Editor an dieser Stelle keine Fehler kennzeichnet, schlagen die Versuche zum Kompilieren aus den vom OP angegebenen Gründen fehl (nämlich fehlende Dateien mit demselben Namen, jedoch mit dem Präfix '.' Im Ordner DerivedData).
Wenn Sie die NSManagedObject-Unterklassen manuell erstellen, nachdem Sie Ihr Modell erstellt haben, ohne die offensichtlich fehlerbehaftete automatische Generierung von Xcode zu verwenden, gibt es keine Probleme. Ein bisschen mehr Tippen, aber viel zuverlässiger! Sie müssen jedoch von einem "sauberen" Projekt aus starten (d. H. Bevor Sie versucht haben, die Unterklassen automatisch zu generieren). Andernfalls bleibt der Fehler bestehen. Die Ableitung abgeleiteter Daten hilft leider nicht.
***** AKTUALISIERT ***** Es scheint etwas seltsames zu sein und es scheint stilles Code-Generieren zu geben, wie ursprünglich angenommen (entschuldigt), aber dies ist ein anderes Verhalten als erwartet . Außerdem ist dieser Code im Editor nicht sichtbar (was ein wenig sinnlos und verwirrend erscheint). Es wird in einem Unterordner von DerivedData> Build> Intermediates> .Build erstellt.
Ich kann völlig verstehen, warum das OP verwirrt war (genau wie ich!). Was dieses "Feature" wert ist, ist zweifellos ein Versuch, hilfreich zu sein, aber es ist etwas verwirrend, wenn Sie an vorheriges Verhalten gewöhnt sind und Ihnen eine Option zur Erzeugung angeboten wird ein sichtbares und bearbeitbares Duplikat aus dem Hauptmenü.
Wählen Sie also im Codegen-Fenster die Option "Manual/None" (siehe unten), und Sie können entweder die Auto-Gen-Option in der Menüleiste verwenden (nachdem Sie den "Junk" gelöscht haben) oder Ihren eigenen Code schreiben.
Folge diesen Schritten,
Deaktivieren Sie die automatische Erzeugung für jede Entität einzeln, indem Sie die Einstellung "Codegen" auf "Manuell/Keine" für die Entität setzen.
Ändern Sie den Entitätsnamen in etwas anderes, damit er gespeichert wird. Zum Beispiel Den Klassennamen ändern; bauen; Ändern Sie den Klassennamen zurück. wieder bauen
Ich habe diesen Fehler bekommen,
Ändern Sie einfach die Werkzeugversion in Xcode 7.3 in Ihre Datei
und es funktioniert gut!
Nachdem ich eine Handvoll geposteter Antworten ausprobiert hatte, funktionierte mein Rechner für mich.
Tom Harrington Die Antwort ist richtig. Es gibt jedoch eine Möglichkeit, eigene Funktionen und/oder Variablen hinzuzufügen, ohne eine der beiden genannten Optionen auszuführen.
Einfach eine Erweiterung der Klasse erstellen. (Stellen Sie sicher, dass Sie der Swift-Datei einen anderen Namen geben als die automatisch generierten NSManagesObject-Dateien.)
Zum Beispiel. Wenn Sie über eine Entität mit dem Namen MyEntity
verfügen, können Sie eine Swift-Datei mit dem Namen MyEntityExtension.Swift
hinzufügen, die in etwa wie folgt aussehen könnte:
import Foundation
import CoreData
import UIKit
extension MyEntity {
var color: UIColor {
get {
return self.colorValue as! UIColor
}
set {
if newValue.isMember(of: UIColor.self) {
self.colorValue = newValue
}
}
}
}
Für alle, die Schwierigkeiten haben, Autogen zur Arbeit zu bringen:
Ich musste "com.Apple.syncservices.Syncable" in den Benutzerinformationseinstellungen für die Entität auf "NO" setzen.
Vielleicht hilft das aus.
Löschen Sie Compile-File-Core-Daten im Tab "Buildphasen" im Bereich "Compile-Quelle" gedrückt -