webentwicklung-frage-antwort-db.com.de

ungültige Redeklaration im automatischen Code generiert NSManagedObject-Unterklasse Swift 3

Verwendung von Version 8.1 von Xcode.

Erstellen Sie eine Entität mit dem Namen "MapRegionObject" in der Datei .xcdatamodeld.  enter image description here

Klicken Sie mit dem automatischen Codegenerator in der Navigationsleiste auf Editor -> NSManagedOject-Unterklasse erstellen ... 

Habe zwei Dateien: MapRegionObject + CoreDataClass.Swift und MapRegionObject + CoreDataProperties

Fehler in zwei Dateien, die auf dem Screenshot angezeigt werden: MapRegionObject + CoreDataClass.Swift  enter image description here

MapRegionObject + CoreDataProperties  enter image description here

Bitte helfen Sie mir, diese Fehler zu beheben, vielen Dank!

50
Summer Ji

In Xcode 8.1 müssen Sie vor der Verwendung des automatischen Codegenerators die Entität in Ihrem Datenmodell auswählen:

Entity

Wechseln Sie dann zur Registerkarte Data Model Inspector:

Data Model Inspector

Wählen Sie unter "Codegen" "Manual/Node" aus.

Danach konnten Sie eine NSManagedObject-Unterklasse ohne Fehler erstellen. 


Wenn Sie 'Class Definition' bereits verwendet haben, können Sie alternativ in Ihre vorhandene Datei " .xcdatamodeld " gehen und unter Codegen alle aktuellen Entitäten auf "Manual/None" setzen. Speichern Sie unbedingt Ihr Projekt (Datei -> Speichern) , löschen Sie Ihre vorhandenen abgeleiteten Daten, bereinigen Sie das Projekt und erstellen Sie anschließend. Das Problem wurde für mich gelöst, ohne dass ich mein gesamtes Modell neu erstellen musste.

121
Kamillpg

Ich fand das Ganze sehr verwirrend. Sie müssen wirklich wissen, was in CoreData Neues ist. Im Allgemeinen wird die Klasse und die Erweiterungen automatisch an einem Ort namens "DerivedData" generiert, der sich in ~/Library/Developer/Xcode/DerivedData befindet, wo diese Klassen und ihre Erweiterungen außerhalb Ihres Codes leben Quelle. Persönlich nicht in der Lage zu sein, sie zu öffnen und anzuschauen, ist für mich komisch, aber etwas, um es zu gewöhnen. 

Wenn Sie in Ihrem CoreData-Modell über eine Entität mit dem Namen "AppSettings" verfügen, können Sie diese einfach verwenden, ohne den Code selbst erstellen zu müssen. Wenn Sie den Code in Ihrem Projekt verwenden möchten, setzen Sie die Codegen-Eigenschaft für die Entität auf Manual/None. Dann machen Sie das, was Sie zuvor gemacht haben: Editor-> Create NSManagedObject-Klassen usw. Die Dateien werden in Ihrem Projekt gespeichert. 

Die gute Nachricht ist, wenn Sie benutzerdefinierte Erweiterungen erstellen möchten, tun Sie dies einfach in Ihrem Projekt. Xcode mischt die generierten Dateien an einem anderen Ort außerhalb Ihres Projektverzeichnisses mit den Dateien in Ihrem Projektverzeichnis.

18
P. Ent

1) Reinige das Projekt (cmd + shift + K)

2) Im "Datenmodell-Inspektor" für jedes erstellte Entity-Setattribut für die Klasse wie im Screenshot unten

 screenshot

3) Code erneut generieren (Editor -> NSManagedObject-Unterklassen erstellen)

Danach sollte alles gut funktionieren.

7
Andrey

Das Problem ist, dass Sie NSManagedObjectModel-Unterklassen nicht mehr manuell generieren müssen . Ref: https://forums.developer.Apple.com/thread/48988

Xcode generiert automatisch Klassen oder Klassenerweiterungen für die Entitäten und Eigenschaften in einem Core Data-Datenmodell. Automatischer Code Die Generierung wird Entität für Entität aktiviert und deaktiviert, und ist für alle Entitäten in neuen Modellen mit der Xcode 8-Datei aktiviert Format. Diese Funktion ist für jedes Datenmodell verfügbar, das auf das Xcode 8-Format aktualisiert. Sie legen fest, ob Xcode .__ generiert. Swift- oder Objective-C-Code für ein Datenmodell unter Verwendung der Datenmodelldatei Inspektor. Wenn die automatische Code-Generierung für eine Entität aktiviert ist, Xcode erstellt eine Klasse oder eine Klassenerweiterung für die Entität als im Inspektor der Entität angegeben: Der angegebene Klassenname wird verwendet und die Quellen werden in die abgeleiteten Daten des Projekts eingefügt. Für beide Swift und Objective-C, diese Klassen sind direkt von der .__ aus nutzbar. Code des Projekts. Für Objective-C wird eine zusätzliche Header-Datei erstellt für alle generierten Objekte in Ihrem Modell: Der Dateiname stimmt mit .__ überein. die Namenskonvention 'DataModelName + CoreDataModel.h'.

3
victor_luu

In Xcode 8.2.1, Menu-Product-Clean every Und jedes ist in Ordnung, es ist so verid.

2
saneryee

Schließen Sie das Projekt und folgen Sie den folgenden Anweisungen:

  1. Zeigen Sie im Finder Ihre .xcdatamodeld-Datenbank an.
  2. klicken Sie mit der rechten Maustaste auf .xcdatamodeld-Datei -> Paketinhalt anzeigen, wenn (.xcdatamodel) im Paket noch einmal mit der rechten Maustaste und 'Paketinhalt anzeigen' gefunden wird. Sie sollten eine 'Inhaltsdatei' erhalten.
  3. 'Inhalt' in der Textbearbeitung öffnen.
  4. Befehl-F (codeGenerationType = "class") und ersetzen Sie alle übereinstimmenden Zeichenfolgen durch leere Zeichenfolgen.

Speichern und öffnen Sie das Xcode-Projekt erneut. Alles sollte gut funktionieren.

2
Satendra dagar

Ich fand diesen Beitrag sehr nützlich für meine Frage.

Was ist neu in Core Data Swift 3.0

So verwenden Sie Kerndaten in iOS 10 (Swift 3)

1
Summer Ji

Kämpfen Sie nicht mit Xcode, es sei denn, Sie müssen Ihre generierten Eigenschaften wirklich ändern. Dies wird Sie nur frustrieren.

Stellen Sie sich die automatisch generierte Klasse wie jede andere Klasse in Ihrer Anwendung vor. Wenn Sie Ihrer verwalteten Objektklasse Funktionen hinzufügen müssen, ändern Sie einfach Ihre Klassendefinition in eine Erweiterung und erweitern Sie Ihr Objekt.

Ändere deine Klasse:

class MyManagedObject : NSManagedObject { /* implementation*/ }

zu einer Erweiterung:

extension MyManagedObject { /* implementation */ }
1
Dan Beaulieu

Das ist keine Antwort. Es ist nur eine Erklärung, was mit den Auswahlen los ist

Stellen Sie sicher, dass Sie diesen Moment für den Core Data Stanford-Kurs sehen

Unten ist ein Transkript, das ich selbst geschrieben habe (es ist nicht 100% genau):

Der Standardwert ist class definition, Wenn Sie diesen auswählen. Es wird diese Unterklasse erzeugen und es wird einfach funktionieren. Sie können als Klasse mit dem Namen Tweet auf Ihre Tweets zugreifen. Das klingt gut. Übrigens, wenn Sie dies tun, wird NICHT in Ihrem Datei-Navigator angezeigt .

Am häufigsten wählen wir category/extension. Dadurch wird nur eine Erweiterung der Tweet-Klasse generiert. Sie müssen die Tweet-Klasse selbst schreiben. Die Erweiterung kümmert sich um die Herstellung aller Vars. Auch wenn ich wieder zur Kategorie/Erweiterung wechsle , wird diese Erweiterung nicht im Navigator angezeigt . Es ist irgendwie vor dir verborgen.

Und warum mögen wir diesen? Weil wir oft unseren eigenen Code hinzufügen wollen. Stellen Sie sich wie in einem Tweet vor, Sie möchten eine statische Methode hinzufügen, mit der Daten von Twitter in einen Tweet in der Datenbank umgewandelt werden. Wo würden wir Code einfügen? Nun, ein großartiger Ort, um diesen Code zu platzieren, wäre die Tweet-Klasse ... wenn es so etwas gäbe ... und die Erweiterung wird das Var-Geschäft für Sie erledigen.

Wenn Sie manual/none Für codegen gewählt haben. Das heißt, mach keinen Code, dann würdest du value/setValue(forKey:) ... viel Glück damit, dass dein Code ein Chaos sein wird. [dh es gibt kein .propertyName = value ... Sie hätten setValue(value, forKey: propertyName)] tun müssen.


Lange Rede, kurzer Sinn, ich bin mir nicht sicher warum, aber aus irgendeinem Grund, wenn Sie nicht die create NSManagedObject -Unterklasse auswählen dann scheint es immer noch zu funktionieren, aber ohne zu zeigen, was unter der Haube passiert. Sehr kontraintuitiv!


Dann schauen Sie sich auch diese Live-Demo des Core Data Stanford-Kurses an :

Jetzt wissen wir, dass wir auf all diese Dinge zugreifen möchten, ohne value/set (value: forKey:) zu verwenden ... wir möchten Unterklassen von Users/Tweets haben. Und wir wollen für all diese Beziehungen Vars [Punktnotation] haben, also brauchen wir diesen Code, um ihn zu generieren. So wie wir das machen, wählen wir einfach die Entität aus ... und gehen hier runter zu CodeGen. Dies sagt standardmäßig Klassendefinition. Das heißt, es ist geschafft. Es hat eine Klasse namens Tweet generiert. und es wird mit var und allen Beziehungen funktionieren. Das wollen wir eigentlich nicht. Wir möchten diese [Kategorie/Erweiterung] auswählen. Wo erstelle ich eine Erweiterung zu Tweet und fügen Sie die var Zeug. Das liegt daran, dass wir die Klasse Tweet schreiben und dort unseren eigenen Code einfügen möchten . Es ist sehr verbreitet, unsere eigene Klasse zu schreiben. Aber du willst immer noch die Var Magie.

0
Honey