struct — was es ist, Schlüsselkonzepte und Syntax in Swift

Autor: IT Sectr Veröffentlicht: 2026-06-17 Lesezeit: 7 Min.

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 ist ein Wertetyp in Swift, der bei der Zuweisung kopiert und per Wert übergeben wird, nicht per Referenz.
  • Copy-on-Write ist eine Optimierung, bei der das tatsächliche Kopieren von Daten nur bei Änderung des Werts erfolgt, nicht bei der Zuweisung.
  • Mutating ist das Schlüsselwort, das für Methoden erforderlich ist, die die Eigenschaften einer Struktur ändern.
  • Protokolle — Strukturen können Protokolle und Erweiterungen implementieren, was Flexibilität ohne Vererbung bietet.
  • Sicherheit — das Fehlen von Referenzzyklen macht Strukturen für Multithread-Code und Datenmodelle bevorzugt.

Was ist struct in Swift?

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.

Struct als Wertetyp

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.

swift
// 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

Copy-on-Write-Optimierung

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.

Veränderbarkeit und mutating-Methoden

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.

Mutating in Aktion

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.

swift
// 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.

Struct vs Class: Vergleich

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.

Merkmalstructclass
TypWertetyp (wird kopiert)Referenztyp (Referenz)
VererbungNicht unterstütztUnterstützt
ARC / ReferenzzählungNicht erforderlichARC erforderlich
DeinitialisierungNicht unterstütztUnterstützt deinit
Eigenschaftsänderung in KonstantenNur über varMöglich über let (Referenz ist konstant)
TypumwandlungNicht unterstütztUnterstützt
Speicherung in SammlungenDirekt 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.

Wann man struct wä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.

Datenmodelle ohne Vererbung

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.

Unveränderliche Daten

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.

Multithread-Code

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).

swift
// 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

Was ist struct in Swift?

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.

Was ist der Unterschied zwischen struct und class in Swift?

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.

Was ist mutating in Swift struct?

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.

Was ist Copy-on-Write in Swift?

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.

Wann sollte man struct und wann class in Swift verwenden?

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

  • Struct ist ein Wertetyp in Swift, der bei der Zuweisung kopiert wird und vorhersagbares Verhalten ohne Nebeneffekte zwischen Kopien bietet.
  • Copy-on-Write optimiert die Leistung von Strukturen — das tatsächliche Kopieren erfolgt nur bei der ersten Mutation, nicht bei jeder Zuweisung.
  • Die Standardtypen von Swift — Int, String, Array, Dictionary — sind als Strukturen implementiert und garantieren Wertesemantik für alle grundlegenden Operationen.
  • Mutating ist ein obligatorisches Schlüsselwort für Methoden, die Struktureigenschaften ändern; es kann nur auf var-Instanzen aufgerufen werden.
  • Strukturen unterstützen keine Vererbung, implementieren aber Protokolle und können Erweiterungen zur Funktionserweiterung nutzen.
  • Equatable und Hashable werden automatisch für Strukturen implementiert, deren Eigenschaften diesen Protokollen entsprechen — das vereinfacht den Vergleich und die Verwendung in Sammlungen.
  • Apple empfiehlt struct als Standardtyp — verwenden Sie class nur, wenn Vererbung, gemeinsame Identität oder ein kontrollierter Objektlebenszyklus erforderlich sind.

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.

Projekt besprechen

Lesen Sie auch