public class A: NSObject {
public class X { }
public init?(x: X? = nil) { }
}
erklären ist alles in Ordnung. Bei Verwendung wie let a = A()
wird der Initialisierer wie erwartet aufgerufen.
Jetzt möchte ich die verschachtelte Klasse X
privat haben, und die parametrisierte init
ebenso (muss natürlich sein). Aber eine einfache init?()
sollte wie bisher öffentlich verfügbar bleiben. Also schreibe ich
public class B: NSObject {
private class X { }
private init?(x: X?) { }
public convenience override init?() { self.init(x: nil) }
}
Aber dies gibt einen Fehler mit dem init?()
initializer: failable initializer 'init()' kann keine nicht-failable initializer außer Kraft setzen mit der außer Kraft gesetzten initializer die public init()
in NSObject
zu sein.
Wie kann ich effektiv einen Initialisierer A.init?()
ohne den Konflikt, aber nicht B.init?()
deklarieren?
Bonusfrage: Warum darf ich einen nicht fehlbaren Initialisierer mit einem fehlbaren nicht überschreiben? Das Gegenteil ist legal: Ich kann einen fehlbaren Initialisierer mit einem nicht-failable überschreiben, der die Verwendung eines erzwungenen super.init()!
erfordert und somit das Risiko eines Laufzeitfehlers einführt. Für mich ist es sinnvoller, die Unterklasse den fehlbaren Initialisierer verwenden zu lassen, da eine Erweiterung der Funktionalität eine größere Chance auf einen Ausfall bietet. Aber vielleicht fehlt mir hier etwas - Erklärung sehr geschätzt.
'override' bedeutet eine Methode mit der gleichen Signatur in der Oberklasse. Jedoch gibt es kein 'init?' In 'NSObject'. – vadian
@vadian: Ja, aber die 'override'-Anweisung lässt die Fehlermeldung' overriding declaration' erfordert ein' override'-Schlüsselwort', so dass es sowieso als überschreiben gilt. Fix-it fügt 'override' ein und gibt den anderen Fehler aus. Darüber hinaus darf ich ein Failable-Init mit einem nicht-failable überschreiben, aber nicht umgekehrt. – Stefan