Struct ist ein Wertetyp (Value Type) in der Sprache Swift, dessen Instanzen beim Übergeben zwischen Codeabschnitten kopiert werden. Im Gegensatz zu Klassen unterstützen Strukturen keine Vererbung, implementieren aber Protokolle, enthalten Eigenschaften und Methoden und bieten eine vorhersagbare Speicherverwaltung ohne ARC. Laut dem Swift Programming Language Guide, 2026 ist struct ein grundlegender Baustein von Swift — selbst die Standardtypen Int, String, Array und Dictionary sind als Strukturen implementiert. Die Sprache empfiehlt Strukturen als bevorzugte Wahl für die Datenmodellierung.
Wichtige Punkte
Struct (Struktur) ist ein zusammengesetzter Datentyp in Swift, der verwandte Eigenschaften und Methoden in einer einzigen Entität gruppiert. Im Gegensatz zu Klassen sind Strukturen Wertetypen: Beim Übergeben an eine Funktion oder Zuweisen an eine neue Variable wird eine unabhängige Kopie der Struktur erstellt, nicht eine Referenz auf das ursprüngliche Objekt.
Swift verwendet Strukturen für alle primitiven Typen: Int, Double, String, Bool, Array, Dictionary und Set. Das bedeutet, dass selbst eine einfache Int wie eine Struktur funktioniert — bei der Zuweisung wird eine Kopie erstellt. Entwickler können ihre eigene Struktur mit beliebigen Eigenschaften und Methoden definieren.
Laut Swift Evolution (SE-0143) ist die Entscheidung, Standardtypen als Strukturen zu implementieren, auf Leistung und Vorhersagbarkeit zurückzuführen. Wertetypen erzeugen keine Referenzzyklen, benötigen keine ARC-Referenzzählung und garantieren, dass die Änderung einer Kopie das Original nicht beeinflusst — das ist für die Datenunveränderlichkeit in Multithread-Szenarien von entscheidender Bedeutung.
Die Wertetyp-Semantik ist der Hauptunterschied zwischen struct und class. Wenn Sie eine Struktur einer neuen Variable zuweisen oder an eine Funktion übergeben, erstellt Swift eine unabhängige Kopie aller Daten. Änderungen an der Kopie beeinflussen das Original nicht, wodurch die für Referenztypen typischen Nebeneffekte entfallen.
// Beispiel für Wertetyp-Semantik
struct Point {
var x: Double
var y: Double
}
var p1 = Point(x: 10, y: 20)
var p2 = p1 // p2 ist eine unabhängige Kopie von p1
p2.x = 99 // Nur p2 ändert sich
print(p1.x) // 10 — p1 unverändert
print(p2.x) // 99
Swift verwendet Copy-on-Write (COW) zur Optimierung des Kopiervorgangs. Wenn mehrere Variablen auf dieselbe Struktur verweisen, aber keine die Daten ändert, findet keine tatsächliche Kopie statt. Swift teilt den Speicher zwischen den Variablen bis zur ersten Mutation — dann wird eine echte Kopie erstellt. Dies verhindert übermäßige Allokationsvorgänge und beschleunigt die Arbeit mit Sammlungen.
Standardmäßig können Methoden einer Struktur deren Eigenschaften nicht ändern — Swift erfordert das explizite mutating-Schlüsselwort für Methoden, die Änderungen vornehmen. Diese Einschränkung schützt vor versehentlicher Mutation und macht den Code vorhersagbar: Wenn eine Methode nicht als mutating markiert ist, ändert sie garantiert die Struktur nicht.
Wenn Sie das mutating-Schlüsselwort vor einer Methode hinzufügen, erhält Swift die Fähigkeit, neue Werte in die Eigenschaften der Struktur zu schreiben. Tatsächlich kann die Methode die Strukturinstanz sogar vollständig durch eine neue via self = ersetzen. Dieser Mechanismus wird zum Beispiel in den Typen Option und Result verwendet.
// Struct mit mutating-Methode
struct Counter {
private var value: Int = 0
// Mutating-Methode — kann Eigenschaften ändern
mutating func increment() {
value += 1
}
// Mutating-Methode kann self vollständig ersetzen
mutating func reset() {
self = Counter()
}
// Nicht-mutating-Methode — schreibgeschützt
func currentValue() -> Int {
return value
}
}
var counter = Counter()
counter.increment()
print(counter.currentValue()) // 1
counter.reset()
print(counter.currentValue()) // 0
Regeln für mutating: Die Struktur muss mit var deklariert werden, nicht mit let — eine konstante Struktur kann keine mutating-Methode aufrufen. Der Compiler prüft dies zur Build-Zeit: Der Versuch, eine mutating-Methode auf einer let-Konstante aufzurufen, führt zu einem Compiler-Fehler.
Die Wahl zwischen struct und class ist eine der grundlegenden Entscheidungen in Swift. Beide Typen können Eigenschaften, Methoden, Initialisierer enthalten und Protokolle implementieren, unterscheiden sich jedoch grundlegend in der Speichersemantik, Vererbung und Lebenszyklusverwaltung.
| Merkmal | struct | class |
|---|---|---|
| Typ | Wertetyp (wird kopiert) | Referenztyp (Referenz) |
| Vererbung | Nicht unterstützt | Unterstützt |
| ARC / Referenzzählung | Nicht erforderlich | ARC erforderlich |
| Deinitialisierung | Nicht unterstützt | Unterstützt deinit |
| Eigenschaftsänderung in Konstanten | Nur über var | Möglich über let (Referenz ist konstant) |
| Typumwandlung | Nicht unterstützt | Unterstützt |
| Speicherung in Sammlungen | Direkt gespeichert (Wert) | Als Referenz gespeichert (Zeiger) |
Strukturen sind vorzuziehen, wenn Daten keine Vererbung benötigen, keine gemeinsame Identität haben sollen (z. B. Koordinaten, Größen, Konfiguration) und zwischen Modulen übergeben werden. Klassen werden für UI-Komponenten (UIView, UIViewController), Singletons und Objekte mit gemeinsamer Identität gewählt.
Apple empfiehlt, struct als Standardtyp für die Datenmodellierung in Swift zu verwenden. Strukturen eignen sich für die meisten Szenarien aufgrund der vorhersagbaren Kopiersemantik und des fehlenden Overheads durch Referenzzählung. Betrachten wir typische Fälle, in denen struct die optimale Wahl ist.
Wenn eine Entität Daten ohne Vererbungsbedarf enthält (Product, User, Order, Point), verwenden Sie struct. Der Compiler generiert automatisch einen memberwise-Initialisierer — Sie müssen init nicht manuell schreiben. Equatable und Hashable werden ebenfalls automatisch für Strukturen implementiert, deren Eigenschaften alle diesen Protokollen entsprechen.
Für Konfigurationen, Einstellungen und Flags, die sich nach der Erstellung nicht ändern, ist struct class vorzuziehen. Eine konstante (let) Struktur garantiert die Unveränderlichkeit aller verschachtelten Felder — bei class bezieht sich dies nur auf die Referenz, nicht auf den Objektinhalt.
Strukturen sind in Multithread-Umgebungen aufgrund der Wertesemantik sicher. Jeder Thread erhält eine unabhängige Kopie der Daten und beeinflusst andere Threads nicht. Datenrennen zwischen Threads sind für Wertetypen unmöglich, was struct zur bevorzugten Wahl für Modelle in SwiftUI macht (ObservableObject erfordert class, aber @State verwendet struct).
// Beispiel für struct-Verwendung bei Datenmodellen
struct User: Codable, Identifiable {
let id: UUID
var name: String
var email: String
var isPremium: Bool
// Berechnete Eigenschaft — nicht mutating
var displayName: String {
isPremium ? "\(name) ⭐️" : name
}
}
// Automatischer memberwise-Initialisierer
let user = User(
id: UUID(),
name: "Alice",
email: "alice@example.com",
isPremium: true
)
// Kopieren ist für Multithreading sicher
var userCopy = user
userCopy.isPremium = false
// user.isPremium bleibt true
Verwenden Sie class, wenn Sie Vererbung (UIKit/AppKit-Komponenten), gemeinsame Identität (delegate, observer) oder einen kontrollierten Objektlebenszyklus (deinit) benötigen. Für alles andere — verwenden Sie struct.
Häufig gestellte Fragen
Struct in Swift ist ein Wertetyp, der beim Übergeben zwischen Codeabschnitten kopiert wird. Strukturen können Eigenschaften, Methoden, Initialisierer enthalten und Protokolle implementieren. Die grundlegenden Swift-Typen (Int, String, Array) sind als Strukturen implementiert.
Struct ist ein Wertetyp (wird bei Zuweisung kopiert), unterstützt keine Vererbung und benötigt kein ARC. Class ist ein Referenztyp (per Referenz übergeben), unterstützt Vererbung, Deinitialisierung und Referenzzählung. Entwickler empfehlen struct als Standardtyp.
Mutating ist ein Schlüsselwort, das angibt, dass eine Strukturmethode deren Eigenschaften ändern kann. Ohne mutating verbietet der Compiler die Feldänderung. Mutating-Methoden können nur auf mit var deklarierten Variablen aufgerufen werden, nicht mit let.
Copy-on-Write (COW) ist eine Swift-Optimierung für Strukturen, bei der das tatsächliche Kopieren von Daten bis zur ersten Mutation verzögert wird. Solange alle Variablen die Struktur nur lesen, teilen sie sich einen Speicherbereich. Dies verbessert die Leistung bei der Arbeit mit großen Sammlungen.
Verwenden Sie struct für Datenmodelle ohne Vererbung, Konfigurationen, DTOs und Multithread-Szenarien. Verwenden Sie class für UIKit/AppKit UI-Komponenten, Singletons, Entitäten mit gemeinsamer Identität (delegate, observer) und Objekte, die eine Deinitialisierung benötigen.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch