In Swift gibt es keine abstrakten Klassen (genau wie in Objective-C). Am besten verwenden Sie ein Protokoll , das einer Java-Schnittstelle ähnelt.
Mit Swift 2.0 können Sie dann Methodenimplementierungen und berechnete Eigenschaftsimplementierungen mithilfe von Protokollerweiterungen hinzufügen. Ihre einzigen Einschränkungen bestehen darin, dass Sie keine Mitgliedsvariablen oder Konstanten bereitstellen können und kein dynamischer Versand erfolgt .
Ein Beispiel für diese Technik wäre:
protocol Employee {
var annualSalary: Int {get}
}
extension Employee {
var biweeklySalary: Int {
return self.annualSalary / 26
}
func logSalary() {
print("$\(self.annualSalary) per year or $\(self.biweeklySalary) biweekly")
}
}
struct SoftwareEngineer: Employee {
var annualSalary: Int
func logSalary() {
print("overridden")
}
}
let sarah = SoftwareEngineer(annualSalary: 100000)
sarah.logSalary() // prints: overridden
(sarah as Employee).logSalary() // prints: $100000 per year or $3846 biweekly
Beachten Sie, dass dies auch für Strukturen "abstrakte Klassen" -ähnliche Funktionen bietet, Klassen jedoch auch dasselbe Protokoll implementieren können.
Beachten Sie auch, dass jede Klasse oder Struktur, die das Mitarbeiterprotokoll implementiert, die Eigenschaft annualSalary erneut deklarieren muss.
Beachten Sie vor allem, dass kein dynamischer Versand erfolgt . Wenn logSalary
für die Instanz aufgerufen wird, die als gespeichert ist, wird SoftwareEngineer
die überschriebene Version der Methode aufgerufen . WannlogSalary
die Instanz aufgerufen wird, nachdem sie in eine umgewandelt wurde Employee
, wird die ursprüngliche Implementierung aufgerufen (sie wird nicht dynamisch an die überschriebene Version gesendet, obwohl die Instanz tatsächlich eine istSoftware Engineer
.
Weitere Informationen finden Sie in einem großartigen WWDC-Video zu dieser Funktion: Bessere Apps mit Werttypen in Swift erstellen