Static und class properties sind Eigenschaften, die dem Typ und nicht der Instanz angehören. Historisch wurden sie entwickelt, um Informationen zu speichern, die für alle Instanzen gemeinsam sind (z. B. Zähler, Konfigurationen, Fabriken). In Swift kann static für alle Typen verwendet werden (class, struct, enum), während class nur in Klassen verwendet werden kann und nur für berechnete Eigenschaften, was eine Überschreibung in Vererbungen ermöglicht.
Problem: Falsche Verwendung von statischen Eigenschaften kann zu Rennzuständen und Fehlern beim Zugriff aus verschiedenen Threads führen. Es ist auch leicht, static und class zu verwechseln und den falschen Mechanismus für die Überschreibung in Vererbungen auszuwählen.
Lösung:
Beispielcode:
class Counter { static var count = 0 static let queue = DispatchQueue(label: "counter.queue") static func increment() { queue.sync { count += 1 } } class var typeDescription: String { return "Generic Counter" } } class NamedCounter: Counter { override class var typeDescription: String { return "Named Counter" } }
Hauptmerkmale:
Frage 1: Ist es möglich, eine static let-Eigenschaft als berechnete (computed) Eigenschaft mit get zu deklarieren?
Ja, eine static property kann sowohl stored als auch computed sein. Für let-Eigenschaften ist das normalerweise eine Konstante, jedoch kann static var durchaus berechnet werden:
struct Math { static var pi: Double { return 3.1415926 } }
Frage 2: Sind static var standardmäßig threadsicher?
Nein, wenn static var aus verschiedenen Threads geändert wird, können Rennzustände auftreten. read/write müssen manuell synchronisiert werden.
Frage 3: Kann man class var für stored Eigenschaften verwenden?
Nein, class var muss immer eine berechnete Eigenschaft (property with get/optional set) sein, stored Eigenschaften sind nur für static erlaubt.
In der Anwendung wurde der Benutzer-Login-Zähler in static var gespeichert und ohne Synchronisation aus verschiedenen Threads inkrementiert.
Vorteile:
Nachteile:
Für ein globales Konfigurationsobjekt wurde static let verwendet, und der Zugriff darauf war nur lesend oder unter Verwendung von DispatchQueue für Schreibzugriffe.
Vorteile:
Nachteile: