Lesen Sie diese Antwort, wenn die Fehlermeldung auf Core Data-Dateien verweist
Synopsis: Möglicherweise verfügen Sie über automatisch generierte und manuell generierte Core Data-verwaltete Objektklassendateien.
Diese Antwort gilt, wenn sich die erste Zeile des Fehlers auf eine Datei Foo + CoreDataProperties.o oder Foo + CoreDataClass.o bezieht . Beispiel:
error: Multiple commands produce '/Users/me/Library/Developer/Xcode/DerivedData/MyApp-uebslaqdwgldkjemijpdqmizgyzc/Build/Intermediates.noindex/ MyApp /Debug-iphonesimulator/ MyApp.build/Objects-normal/x86_64/Foo+CoreDataProperties.o':
1) Target ' MyApp ' (project ' MyApp ') has compile command for Swift source files
2) Target ' MyApp ' (project ' MyApp ') has compile command for Swift source files
Die Hauptursache kann durch Erweitern des Abschnitts Compile Swift Source Files des Build Transcript ermittelt werden. Zum Beispiel:
<unknown>:0: error: filename "Address+CoreDataClass.swift" used twice: '/Users/myUserName/Projects/Jnky/Foo+CoreDataProperties' and '/Users/jk/myUserName/Developer/Xcode/DerivedData/MyApp-uebslaqdwgldkjemijpdqmizgyzc/Build/Intermediates.noindex/MyApp.build/Debug/MyApp.build/DerivedSources/CoreDataGenerated/Jnky/Foo+CoreDataProperties.swift'
Die erste dort erwähnte Datei ist eine Quelldatei in Ihrem Projektverzeichnis, die jemand generiert hat, indem er Ihr Datenmodell im Projektnavigator ausgewählt und im Menü Editor > Verwaltete Objektunterklasse erstellen geklickt hat . Diese Funktion wurde in Xcode 7 oder so hinzugefügt.
Die zweite Datei ist eine gleichnamige Datei, die jedoch in Xcodes vergraben ist DerivedData
. Diese Datei wird bei jedem Build automatisch von Xcode generiert , wenn die .xcdatamodeld
Datei data model ( ) in der Build-Phase Compile Sources des Ziels enthalten ist . Diese Funktion wurde in Xcode 9 oder so hinzugefügt. Abhängig von der Einstellung des Codegen-Popups werden für jede Entität / Klasse null, ein oder zwei Dateien generiert . Dieses Popup befindet sich im Datenmodellinspektor, wenn Sie beim Bearbeiten Ihres Datenmodells eine Entität auswählen.
Die Einstellungen sind:
- Manuell / Keine Es werden keine Dateien generiert
- Kategorie / Erweiterung Eine Datei, Foo + CoreDataProperties.m oder .swift, wird generiert und enthält eine Objective-C-Kategorie oder eine Swift-Erweiterung.
- Klassendefinition Am selben Kategorie / Verlängerungs - Datei generiert wird, und zusätzlich ein Foo + CoreDataClass.m oder .swift erzeugt wird , Klassendeklaration und Definition enthält.
Sie sehen also, dass das Problem auftritt, wenn ein Entwickler (wie ich), der an den älteren Xcode gewöhnt ist, ein Projekt in einem neueren Xcode startet. Wir sind der Meinung, dass wir den Menüpunkt " Verwaltete Objektunterklasse erstellen" verwenden müssen, um die Dateien zu erstellen, die im Projektnavigator angezeigt werden, ohne zu bemerken, dass unsere Einstellungen im Codegen- Popup dazu führen, dass Xcode doppelte Dateien erstellt, die Apple verwendet "clever" wird im Projektnavigator nicht angezeigt, da sie den Entwicklern nicht vertrauen, dass sie den Kommentar in der Kopfzeile lesen und beachten. // Diese Datei wurde automatisch generiert und sollte nicht bearbeitet werden.
Lösung 1 - Verwenden Sie den älteren Weg
Sie können alle automatischen Codegen für ein Datenmodell mit nur einer Einstellung deaktivieren :
- Öffnen Sie das Problem des Ziels Build - Phasen (im Projekt - Navigator , wählen Sie Projekt, dann in der Liste der ZIELVORGABEN , die angezeigt wird , wählen Sie das Problem Ziel, dann auf die Registerkarte Build - Phasen ).
- Erweitern Sie den Eintrag Quellen kompilieren und suchen Sie das Problemdatenmodell (
.xcdatamodeld
Datei).
- Löschen Sie es aus der Kompilierungsliste
- Stellen Sie sicher, dass das Datenmodell in der Liste Copy Bundle Resources enthalten ist.
Lösung 2 - Core Data Magic für Anfänger
Hier gehen Sie auf dem neueren Weg All-In.
- Lassen Sie Ihr Datenmodell unverändert in den Compile Sources .
- In jedem Entity - Inspektor in Ihrem Datenmodell setzen Codegen auf Klassendefinition .
- Löschen und löschen Sie im Projektnavigator alle Foo + CoreDataClass- Dateien und benennen Sie alle Foo + CoreDataProperties.m- oder .swift- Dateien in Foo + MyProperties um .
- Wenn in jeder Foo + MyProperties.m- oder .swift- Datei Eigenschaften vorhanden sind, die von Xcode generiert wurden, löschen Sie diese Eigenschaften, da sie sich in den von Codegen erstellten versteckten Dateien befinden .
Mit dieser Lösung werden Ihre Klassendefinitionen bei jedem Build automatisch aus dem Datenmodell generiert. Sie können sie nicht einmal sehen. Es ist Core Data Magic , nett und einfach für Anfänger.
Lösung 3 - Für die meisten realen Apps
Lösung 2 ist jedoch nicht gut, wenn Sie wirklich nicht verwaltete Eigenschaften hinzufügen möchten. (In Objective-C können keine Eigenschaften in Kategorien hinzugefügt werden, und in Swift können gespeicherte Eigenschaften nicht in Erweiterungen hinzugefügt werden.) In den meisten realen Apps möchten Sie also wahrscheinlich auf halbem Weg zwischen Lösung 1 und 2 wechseln.
- Belassen Sie Ihr Datenmodell in der Liste der Kompilierungsquellen
- Setzen Sie in jedem Entitätsinspektor in Ihrem Datenmodell Codegen auf Kategorie / Erweiterung .
- Löschen Sie im Projektnavigator alle Foo + CoreDataClass.m- oder .swift- Dateien und legen Sie sie in den Papierkorb. Um zukünftige Verwirrung zu vermeiden , benennen Sie alle Foo + CoreDataProperties.m- oder .swift- Dateien in möglicherweise nur Foo.m oder .swift um .
- Stellen Sie sicher, dass jede Foo.m- oder .swift- Datei die Klassendefinition enthält, zu der Sie Ihre eigenen nicht verwalteten Eigenschaften hinzufügen können.
(Danksagung zur Antwort von Positron. Meine Antwort hier erklärt, warum die Antwort von Positron (meine Lösung 1) funktioniert, und fügt Lösung 2 und Lösung 3 hinzu.)