Gibt es eine Standardmethode, um in Swift eine "reine virtuelle Funktion" zu erstellen, d. H. einer, der muss von jeder Unterklasse außer Kraft gesetzt werden, und die, wenn sie es nicht, eine Kompilierung Fehler verursacht ist?
swift
abstract
swift-protocols
JuJoDi
quelle
quelle
protocol
s implementiert (im Vergleich zuinterface
s in Java). Wenn Sie sie wie abstrakte Methoden verwenden müssen, schauen Sie sich diese Frage / Antwort an: stackoverflow.com/a/39038828/2435872Antworten:
Sie haben zwei Möglichkeiten:
1. Verwenden Sie ein Protokoll
Definieren Sie die Oberklasse als Protokoll anstelle einer Klasse
Pro : Überprüfung der Kompilierungszeit, um festzustellen, ob jede "Unterklasse" (keine tatsächliche Unterklasse) die erforderlichen Methoden implementiert.
Con : Die "Superklasse" (Protokoll) kann keine Methoden oder Eigenschaften implementieren
2. Bestätigen Sie in der Super-Version der Methode
Beispiel:
Pro : Kann Methoden und Eigenschaften in der Oberklasse implementieren
Con : Keine Überprüfung der Kompilierungszeit
quelle
fatalError
keine Überprüfung der Kompilierungszeit möglich ist, ist es schön, dass der Compiler zumindest so intelligent ist, dass Sie beim Aufrufen des Ausführungspfads keinen Rückgabewert für die Methode angeben müssenfatalError
.super.someFunc()
der überschriebenen Methode der Fehler angezeigt wird, obwohl Sie ihn überschrieben haben. Sie wissen, dass Sie es nicht nennen sollen, aber jemand anderes muss das nicht wissen und einfach der Standardpraxis folgen.Im Folgenden können Sie von einer Klasse erben und die Kompilierungszeit des Protokolls überprüfen lassen :)
quelle
Es gibt keine Unterstützung für abstrakte Klassen- / virtuelle Funktionen, aber Sie könnten wahrscheinlich in den meisten Fällen ein Protokoll verwenden:
Wenn SomeClass someMethod nicht implementiert, wird der folgende Fehler beim Kompilieren angezeigt:
quelle
Eine andere Problemumgehung, wenn Sie nicht zu viele "virtuelle" Methoden haben, besteht darin, dass die Unterklasse die "Implementierungen" als Funktionsobjekte an den Basisklassenkonstruktor übergibt:
quelle
Sie können das Protokoll gegen die Behauptung verwenden, wie in der Antwort hier von vorgeschlagen
drewag
. Ein Beispiel für das Protokoll fehlt jedoch. Ich decke hier ab,Protokoll
Jetzt müssen alle Unterklassen das Protokoll implementieren, das in der Kompilierungszeit überprüft wird. Wenn SomeClass someMethod nicht implementiert, wird der folgende Fehler beim Kompilieren angezeigt:
Hinweis: Dies funktioniert nur für die oberste Klasse, die das Protokoll implementiert. Alle Unterklassen können die Protokollanforderungen leichtfertig ignorieren. - wie kommentiert von
memmons
Behauptung
Assertion funktioniert jedoch nur zur Laufzeit.
quelle
Da ich neu in der iOS-Entwicklung bin, bin ich mir nicht ganz sicher, wann dies implementiert wurde. Eine Möglichkeit, das Beste aus beiden Welten herauszuholen, besteht darin, eine Erweiterung für ein Protokoll zu implementieren:
Mit der Erweiterung können Sie den Standardwert für eine Funktion festlegen, während die Funktion im regulären Protokoll weiterhin einen Fehler bei der Kompilierung liefert, wenn sie nicht definiert ist
quelle