Was verbirgt das Schlüsselwort open in Swift? Erklärung für Einsteiger
Haben Sie jemals eine Klasse in Swift geschrieben, ihr public hinzugefügt und dann versucht, in einem anderen Modul von ihr zu erben – und einen Kompilierungsfehler erhalten? Wenn ja, sind Sie nicht allein. Diese Frage ist eine der häufigsten auf Stack Overflow unter angehenden Swift-Entwicklern. Tausende Menschen stoßen sich am selben Stein: dem Schlüsselwort open.
In diesem Artikel klären wir ein für alle Mal, was open in Swift ist, wie es sich von public unterscheidet, wann man es verwenden sollte und wann – absolut nicht. Wir schreiben echten Code, betrachten Fehler und lernen, sie zu beheben. Los geht's!
Das System der Zugriffsmodifikatoren in Swift: Eine kurze Einführung
Bevor wir in open eintauchen, erinnern wir uns daran, welche Zugriffsebenen es in Swift überhaupt gibt. Es gibt fünf (von der restriktivsten zur offensten):
private– nur innerhalb einer Datei und einer Deklaration zugänglich (z. B. innerhalb einer Klasse).fileprivate– innerhalb der gesamten Datei zugänglich.internal– innerhalb des gesamten Moduls zugänglich (dies ist die Standardebene).public– von anderen Modulen aus zugänglich, aber Vererbung und Überschreibung sind nicht erlaubt.open– von anderen Modulen aus zugänglich, Vererbung und Überschreibung sind erlaubt.
Die Hauptspannung liegt im Unterschied zwischen public und open. Auf den ersten Blick ähneln sie sich: Beide erlauben den Zugriff auf eine Klasse, Methode oder Eigenschaft aus einem anderen Modul. Aber es gibt einen grundlegenden Unterschied, den wir jetzt anhand von Beispielen analysieren.
Beispiel: Eine public Klasse, die nicht erweitert werden kann
Stellen Sie sich vor, Sie schreiben eine Bibliothek (ein Framework) für die Netzwerkarbeit. Sie erstellen eine Klasse NetworkService und machen sie public:
// Modul: MyNetworkingFrameworkpublic class NetworkService { public func fetchData() { print("Fetching data from network...") }}Nun bindet ein anderer Entwickler Ihr Framework ein und möchte eine eigene verbesserte Klasse darauf aufbauen:
// Modul: MyAppimport MyNetworkingFramework
// Fehler! Cannot inherit from a public classclass MyNetworkService: NetworkService { override func fetchData() { print("My custom fetching...") }}Der Compiler gibt einen Fehler aus. Warum? Weil public ein Nur-Lese-Zugriff aus einem anderen Modul ist. Sie können eine Instanz der Klasse verwenden, ihre Methoden aufrufen, aber nicht von ihr erben. Dies ist beabsichtigt: Der Autor der Bibliothek möchte kontrollieren, welche Klassen erweitert werden können und welche nicht.
Lösung: Verwenden Sie open
Wenn der Autor der Bibliothek die Vererbung erlauben möchte, muss er explizit open angeben:
// Modul: MyNetworkingFrameworkopen class NetworkService { open func fetchData() { print("Fetching data from network...") }}Jetzt kann in einem anderen Modul problemlos geerbt und Methoden überschrieben werden:
// Modul: MyAppimport MyNetworkingFramework
class MyNetworkService: NetworkService { override func fetchData() { print("My custom fetching with extra logging...") super.fetchData() }}Das ist die ganze Magie. Das Schlüsselwort open ist die Erlaubnis zur Vererbung und Überschreibung außerhalb des Moduls.
Warum ist open für die Architektur wichtig?
Die Entwickler von Swift und Apple haben diesen Unterschied nicht ohne Grund eingeführt. Er hilft, stabile und sichere APIs zu entwerfen. Stellen Sie sich vor, Sie veröffentlichen eine Bibliothek und alle Klassen darin sind open.