Fehler bei Swift- und Core-Daten: Schwerwiegender Fehler: Verwendung des nicht implementierten Initialisierers 'init (Entität: insertIntoManagedObjectContext :)'

8

Ich habe die folgende Klasse, die von NSManagedObject erbt:

%Vor%

Wenn ich Instanzen davon erstelle, funktioniert alles gut, aber wenn ich nach diesen Objekten suche, bekomme ich einen sehr merkwürdigen Fehler:

%Vor%

Dies ist der Code, der den Fehler verursacht:

%Vor%

Ich fand heraus, dass das Ändern des Initialisierers, indem man es zu einem Convenience-Element macht und Self statt Super aufruft, das Problem beseitigt, aber ich habe keine Ahnung warum.

%Vor%

Der obige Code funktioniert, aber ich habe keine Ahnung warum. Weiß jemand was los ist? Ist es ein Fehler oder ist meine Schuld?

    
cfischer 05.10.2014, 11:49
quelle

2 Antworten

11

Dies ist dokumentierte Verhalten.

  

Swift-Unterklassen erben standardmäßig nicht ihre Superklassen-Initialisierer

Zum Beispiel kompiliert folgender Code nicht einmal, weil Child nicht automatisch init(id:String) erbt. Dieser Mechanismus stellt sicher, dass name in Child korrekt initialisiert ist.

%Vor%

Wenn Sie in der Unterklasse nur convenience Initialisierer definieren, übernimmt sie automatisch alle Initialisierer, die in der Oberklasse als Initialisierer bezeichnet werden, wie in Abschnitt "Automatische Initialisierungsvererbung"

dokumentiert     
rintaro 05.10.2014, 19:20
quelle
4

Sie müssen Folgendes in Ihrer Unterklasse NSManagedObject implementieren (dies ist die Version Swift 3.0):

%Vor%

Die Antwort beantwortet es, aber nicht wirklich direkt.

Der Grund dafür ist, dass Swift ihre Supercalls nicht als initialisierte Initializer vererbt. AND es scheint, als ob CoreData diesen Initialisierer beim Abrufen verwendet (fügt einen Haltepunkt in die Methode ein). Hier also "bringen" wir den designierten Initialisierer für CoreData zum Einsatz.

Wenn Sie NSManagedObject Basisklassen haben, müssen Sie diese Methode auch in diesen implementieren.

Dank an JSQCoreDataKit für die Idee .

    
kgaidis 31.08.2016 02:06
quelle