In Swift wurde von Anfang an der Fokus auf Werttypen gelegt — Strukturen (struct) als Hauptinstrument zur Datenmodellierung. Im Gegensatz zu Objective-C, wo alles Objekte (Klassen) waren, fördert Swift die Verwendung von Strukturen für einfache Modelle, Daten und kleine Geschäftsobjekte.
Viele Entwickler, insbesondere mit Erfahrung in anderen objektorientierten Sprachen, verwenden fälschlicherweise Klassen für alles. Dies führt zu Problemen mit dem Speicher (Referenzzyklen), unerwarteten Änderungen beim Übertragen von Objekten und Schwierigkeiten mit der Thread-Sicherheit, da Klassen — Referenztypen sind.
Strukturen in Swift sind Werttypen, sie werden bei der Zuweisung und dem Übertragen in Funktionen kopiert, im Gegensatz zu Klassen (Referenztypen), die eine Referenz weitergeben. Genau das macht Strukturen bevorzugt für Modelle ohne komplexe Lebenszykluslogik und Vererbung.
Beispielcode:
struct Point { var x: Int var y: Int } var p1 = Point(x: 10, y: 20) var p2 = p1 p2.x = 30 // p1.x bleibt 10
Wesentliche Merkmale:
Kann eine Struktur einen Nachfolger (subclass) haben?
Nein, Strukturen in Swift unterstützen keine Vererbung. Alle Verhaltens-erweiterungen sind nur über Protokolle und Erweiterungen möglich.
Bedeutet das, dass eine Struktur immer kopiert wird, wenn sie in eine Funktion übergeben wird?
In der Praxis verwendet Swift Copy-On-Write-Optimierungen. Wenn wir die Struktur nicht ändern, wird sie nicht kopiert, und eine Kopie wird nur bei einer Änderung erstellt. Das betrifft Standardkollektionen und komplexe Strukturen.
var arr1 = [1, 2, 3] var arr2 = arr1 arr2.append(4) // Hier erfolgt die Kopie
In welchen Fällen kann man keine Struktur verwenden?
Klassen wurden zur Speicherung homogener Daten verwendet (zum Beispiel für Punkte auf einer Karte), was zu einem Leistungsverlust durch häufigen Zugriff auf den Speicher, komplexem Speichermanagement und Bugs mit vertauschten Referenzen führte.
Vorteile:
Nachteile:
Verwendung von Strukturen für Datenmodelle, die sicher kopiert werden, keine Leaks verursachen und keine unnötige Komplexität aufweisen.
Vorteile:
Nachteile: