Static func vs class func in Swift: Was ist der Unterschied?

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

Static func vs class func in Swift: Ein umfassender Leitfaden für Entwickler

\n\n

Jeder, der in Swift programmiert, steht früher oder später vor dem Dilemma: static func oder class func? Auf den ersten Blick dienen beide Schlüsselwörter der Erstellung von Methoden auf Typebene. Der Unterschied zwischen ihnen ist jedoch keine bloße syntaktische Marotte, sondern ein grundlegender Unterschied, der mit Vererbung und Polymorphie zusammenhängt. In diesem Artikel klären wir ein für alle Mal, worin sich static func von class func in Swift unterscheidet, wann man welche verwendet und wie dieses Wissen hilft, saubereren und flexibleren Code zu schreiben.

\n\n

Was sind Typmethoden in Swift?

\n\n

Bevor wir in die Unterschiede eintauchen, erinnern wir uns an die Grundlagen. In Swift werden Methoden in zwei Typen unterteilt:

\n\n
    \n
  • Instanzmethoden (instance methods) – werden auf einem konkreten Objekt einer Klasse, Struktur oder Enumeration aufgerufen.
  • \n
  • Typmethoden (type methods) – werden auf dem Typ selbst aufgerufen, nicht auf seiner Instanz. Zu ihrer Deklaration werden die Schlüsselwörter static oder class verwendet.
  • \n
\n\n

Typmethoden eignen sich ideal für Factory-Methoden, Singletons, Hilfsfunktionen und Konfigurationen, die nicht an einen bestimmten Objektzustand gebunden sind.

\n\n

Static func: Der oberste Hüter der Unveränderlichkeit

\n\n

static func ist eine Methode, die nicht überschrieben werden kann in einer Unterklasse. Sie gehört ausschließlich dem Typ, in dem sie definiert ist. Das Schlüsselwort static funktioniert gleichermaßen für Klassen, Strukturen und Enumerationen.

\n\n

Beispiel: static func in einer Klasse

\n\n
class Animal {\n    static func describe() {\n        print("Ich bin ein Tier. Mein Wesen kann nicht geändert werden.")\n    }\n    \n    func speak() {\n        print("Ich gebe einen Laut von mir")\n    }\n}\n\nclass Dog: Animal {\n    // Fehler! Eine static-Methode kann nicht überschrieben werden\n    // override static func describe() { }\n    \n    override func speak() {\n        print("Wau-wau!")\n    }\n}\n\n// Verwendung\nAnimal.describe()  // "Ich bin ein Tier. Mein Wesen kann nicht geändert werden."\nDog.describe()     // Ebenfalls "Ich bin ein Tier. Mein Wesen kann nicht geändert werden."\n
\n\n

Beachten Sie: Dog.describe() ruft die Methode der Elternklasse auf. Obwohl die Unterklasse technisch gesehen die statische Methode erbt, kann sie nicht überschrieben werden. Dieses Verhalten ähnelt final class func.

\n\n

Static func in Strukturen

\n\n

Strukturen (value types) unterstützen ebenfalls statische Methoden:

\n\n
struct MathHelper {\n    static func square(_ number: Int) -> Int {\n        return number * number\n    }\n}\n\nlet result = MathHelper.square(5)  // 25\n
\n\n

Da Strukturen keine Vererbung unterstützen, ist static hier die einzige Möglichkeit, eine Typmethode zu deklarieren.

\n\n

Class func: Flexibilität durch Vererbung

\n\n

class func ist eine Typmethode, die überschrieben werden kann in einer Unterklasse. Sie ist nur für Klassen (reference types) verfügbar. Strukturen und Enumerationen können class nicht verwenden.

\n\n

Beispiel: class func und ihre Überschreibung

\n\n
class Vehicle {\n    class func makeNoise() {\n        print("Das Fahrzeug macht Lärm")\n    }\n    \n    class final func isMotorized() -> Bool {\n        return true\n    }\n}\n\nclass Car: Vehicle {\n    override class func makeNoise() {\n        print("Das Auto brummt: brrrr!")\n    }\n    \n    // Fehler! Eine final class func kann nicht überschrieben werden\n    // override class func isMotorized() -> Bool { return false }\n}\n\n// Verwendung\nVehicle.makeNoise()  // "Das Fahrzeug macht Lärm"\nCar.makeNoise()      // "Das Auto brummt: brrrr!"\n
\n\n

Wie Sie sehen, verhält sich class func wie eine normale virtuelle Methode, wird aber auf Typebene aufgerufen. Dies eröffnet Möglichkeiten für Polymorphie auf Klassenebene.

\n\n

Blogs

Buchempfehlungen