In Programmiersprachen der C-Familie (einschließlich Objective-C) gab es schon immer „Klassenmethoden“ (class methods). In Swift gibt es zwei Arten solcher Methoden für Typen — static und class. Sie ermöglichen es, Methoden auf dem Typ selbst und nicht auf einer Instanz zu aufzurufen. Static wird für Strukturen, Aufzählungen und Klassen verwendet, die nicht überschrieben werden können, class — für Klassen mit der Möglichkeit, in Unterklassen überschrieben zu werden.
Problem: Verwirrung zwischen static und class tritt in Klassenhierarchien auf, in denen Vererbung möglich ist und man das Überschreiben von Methoden/Eigenschaften für Nachkommen erlauben oder verbieten möchte.
Lösung:
Beispielcode:
class Animal { class func makeSound() { print("Ein generisches Tiergeräusch") } static func kingdom() -> String { "Animalia" } } class Dog: Animal { override class func makeSound() { print("Woof!") } // override static func kingdom() — Fehler: static kann nicht überschrieben werden! } Animal.makeSound() // Ein generisches Tiergeräusch Dog.makeSound() // Woof! print(Animal.kingdom()) // Animalia
Wesentliche Merkmale:
Kann man class func in einer struct oder enum verwenden?
Nein, class func ist nur für Klassen erlaubt. Struct und enum unterstützen nur static Methoden und Eigenschaften.
Kann eine static property berechnet und/oder veränderlich (var) sein?
Ja, eine static property kann sowohl berechnete (computed) als auch gespeicherte (stored) sein und über static var definiert werden. Für struct und enum ist dies der einzige Weg, eine property über den Typ selbst und nicht über eine Instanz zugänglich zu machen.
Beispielcode:
struct Counter { static var totalCount = 0 static var nextId: Int { totalCount += 1 return totalCount } }
Kann man eine class method über eine Instanz der Klasse aufrufen?
Ja, aber das wird nicht empfohlen: eine class method bezieht sich immer auf den Typ und nicht auf ein bestimmtes Objekt, daher wird das Verhalten des ursprünglichen Typs oder der Überschreibung aufgerufen, das hat nichts mit dem spezifischen Objekt zu tun.
Verwendung von class func für statische Utility-Klassen, obwohl keine Überschreibung vorgesehen ist.
Vorteile:
Nachteile:
Verwendung von static für Konstanten und Utilities, class — für Fabrikmethoden, die tatsächlich in Unterklassen geändert werden können.
Vorteile:
Nachteile: