Ich habe die folgende Klasse, die von NSManagedObject
erbt:
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?
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.
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"
Sie müssen Folgendes in Ihrer Unterklasse NSManagedObject
implementieren (dies ist die Version Swift 3.0):
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.
Tags und Links cocoa initialization core-data swift