Static vs Class in Swift: Was soll man für seinen Code wählen?

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Die ewige Debatte static vs class in Swift

\n

Wenn Sie jemals in Swift programmiert haben, sind Sie sicherlich auf die Situation gestoßen: Sie müssen eine Methode oder Variable erstellen, die zum Typ selbst gehört und nicht zu seiner Instanz. Und dann stellt sich die Frage – soll man das Schlüsselwort static oder class verwenden? Auf Stack Overflow hat diese Frage tausende Aufrufe, und das zu Recht: Der Unterschied ist subtil, aber für das richtige Design der App-Architektur entscheidend.

\n

In diesem Tutorial klären wir ein für alle Mal, worin sich static und class in Swift unterscheiden, wann man was verwendet und wie man bei der Vererbung nicht in die Falle tappt. Los geht's!

\n\n

Was sind Typeigenschaften und -methoden?

\n

Bevor wir in die Tiefe gehen, erinnern wir uns an die Grundlagen. In Swift hat jede Klasse, Struktur oder Aufzählung zwei Arten von Mitgliedern:

\n
    \n
  • Instanzmitglieder (instance) – gehören zu einem bestimmten Objekt. Um sie zu nutzen, muss man eine Instanz erstellen: let obj = MyClass().
  • \n
  • Typmitglieder (type) – gehören zum Typ selbst. Sie werden über den Typnamen aufgerufen: MyClass.someMethod().
  • \n
\n

Um Typeigenschaften und -methoden in Swift zu erstellen, verwendet man die Schlüsselwörter static und class. Und hier wird es interessant.

\n\n

Static: Streng und unveränderlich

\n

Das Schlüsselwort static ist Ihr verlässlicher Freund, wenn Sie eine Eigenschaft oder Methode erstellen möchten, die in einer Unterklasse nicht überschrieben werden kann. Es funktioniert gleichermaßen für Klassen, Strukturen und Aufzählungen.

\n

Schauen wir uns ein Beispiel an. Stellen Sie sich vor, wir schreiben eine App zur Studentenverwaltung und möchten die Gesamtzahl der erstellten Objekte speichern:

\n\n
class Student {\n    static var totalCount = 0\n    \n    let name: String\n    \n    init(name: String) {\n        self.name = name\n        Student.totalCount += 1\n    }\n    \n    static func printTotal() {\n        print("Gesamtzahl der Studenten: \\(totalCount)")\n    }\n}\n\nlet s1 = Student(name: "Ivan")\nlet s2 = Student(name: "Maria")\nStudent.printTotal() // Gibt aus: Gesamtzahl der Studenten: 2
\n\n

Beachten Sie: Wir greifen auf totalCount und printTotal() über den Klassennamen Student zu, nicht über eine Instanz. Dies ist praktisch für Zähler, Standardkonfigurationen oder das Zwischenspeichern von Daten.

\n\n

Static in Strukturen und Aufzählungen

\n

In Strukturen und Aufzählungen ist static die einzige Möglichkeit, Typmitglieder zu deklarieren. Zum Beispiel:

\n\n
enum HTTPMethod {\n    case get\n    case post\n    case put\n    \n    static let defaultMethod: HTTPMethod = .get\n}\n\nstruct AppConfig {\n    static let apiURL = "https://api.example.com"\n    static let timeout: Double = 30.0\n}
\n\n

Hier funktioniert static einwandfrei, da Strukturen und Aufzählungen keine Vererbung unterstützen und somit keine Überschreibung erforderlich ist.

\n\n

Class: Flexibilität durch Vererbung

\n

Das Schlüsselwort class hingegen ist ein Werkzeug für diejenigen, die mit Klassen (und nur mit diesen) arbeiten und Unterklassen die Möglichkeit geben möchten, Methoden oder Eigenschaften zu überschreiben. class kann nicht in Strukturen oder Aufzählungen verwendet werden.

\n

Angenommen, wir haben eine Basisklasse Vehicle und möchten, dass jede Unterklasse ihre eigene Version einer Beschreibung bereitstellen kann:

\n\n
class Vehicle {\n    class func description() -> String {\n        return "Dies ist ein Fahrzeug"\n    }\n}\n\nclass Car: Vehicle {\n    override class func description() -> String {\n        return "Dies ist ein Auto"\n    }\n}\n\nclass Bicycle: Vehicle {\n    override class func description() -> String {\n        return "Dies ist ein Fahrrad"\n    }\n}\n\nprint(Vehicle.description()) // Dies ist ein Fahrzeug\nprint(Car.description())     // Dies ist ein Auto\nprint(Bicycle.description()) // Dies ist ein Fahrrad                

Blogs

Buchempfehlungen