class — was es ist, Schlüsselkonzepte und Funktionsweise in Swift

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

Class ist ein Referenztyp (reference type) in der Sprache Swift, dessen Instanzen bei der Zuweisung nicht kopiert, sondern als Referenz übergeben werden. Im Gegensatz zu Strukturen unterstützen Klassen Vererbung, Deinitialisierung und automatische Referenzzählung ARC für die Speicherverwaltung. Laut dem Swift Programming Language Guide, 2026 wird class für die Arbeit mit Apples UI-Frameworks (UIKit, AppKit) und die Implementierung von Mustern benötigt, die eine gemeinsame Objektidentität erfordern. Die Wahl zwischen class und struct ist eine der wichtigsten Architekturentscheidungen in Swift.

Wichtige Punkte

  • Class — ein Referenztyp in Swift, bei dem eine Variable eine Referenz auf ein Objekt im Heap speichert, nicht den Wert selbst.
  • Vererbung — Klassen können Eigenschaften und Methoden einer Elternklasse erben und diese mit override überschreiben.
  • ARC — die automatische Referenzzählung gibt Speicher frei, wenn keine starken Referenzen mehr auf ein Objekt vorhanden sind.
  • Deinit — eine spezielle Methode, die vor der Freigabe eines Objekts aufgerufen wird, um Ressourcen zu bereinigen.
  • Identität — die Operatoren === und !== prüfen, ob zwei Variablen auf dieselbe Klasseninstanz verweisen.

Was ist class in Swift?

Class — ein zusammengesetzter Referenztyp in Swift, der Eigenschaften und Methoden mit Unterstützung für Vererbung und dynamischen Dispatch in einer Entität gruppiert. Im Gegensatz zu struct wird eine Klasseninstanz im Heap erstellt, und eine Variable speichert eine Referenz auf diese Instanz, nicht die Daten selbst.

Wenn Sie eine Klassenvariable einer anderen Variable zuweisen, verweisen beide auf dasselbe Objekt im Speicher. Änderungen über eine Referenz sind über die andere sichtbar — dies ist eine grundlegende Eigenschaft von Referenztypen, die in Delegations-, Beobachtungs- und Shared-State-Mustern verwendet wird.

Laut der Apple Swift Dokumentation sind Klassen der einzige Weg, um mit UIKit und AppKit zu arbeiten, wo alle UI-Komponenten von UIView und UIViewController erben. Darüber hinaus sind Klassen für die Implementierung von Mustern erforderlich, die Objektidentität (zwei Referenzen auf ein Objekt) und kontrollierte Lebensdauer erfordern.

Class als Referenztyp

Referenztypsemantik — die Haupteigenschaft von Klassen. Beim Zuweisen einer Klasse zu einer neuen Variable kopiert Swift die Referenz, nicht die Daten. Alle Variablen, die auf dieselbe Instanz verweisen, sehen ihren aktuellen Zustand und können ihn ändern. Dieses Verhalten unterscheidet sich grundlegend von Werttypen, bei denen jede Variable eine unabhängige Kopie erhält.

swift
// Beispiel für Referenztypsemantik
class User {
    var name: String
    init(name: String) { self.name = name }
}

let user1 = User(name: "Alice")
let user2 = user1           // user2 — gleiche Referenz
user2.name = "Bob"

print(user1.name)               // "Bob" — über user2 geändert!

// Identitätsprüfung mit === Operator
print(user1 === user2)          // true — gleiches Objekt

Die Operatoren === (Identität) und !== prüfen, ob zwei Variablen auf dieselbe Klasseninstanz verweisen. Dies unterscheidet sich von == (Gleichheit), das Eigenschaftswerte vergleicht. Der === Operator ist für struct nicht verfügbar — Werttypen haben keine Identität.

Vererbung von Klassen

Vererbung — ein Mechanismus, bei dem eine Klasse die Eigenschaften und Methoden einer Elternklasse übernehmen kann. In Swift kann eine Klasse nur von einem Elternteil erben (Einzelvererbung), aber mehrere Protokolle implementieren. Das Schlüsselwort override ermöglicht das Überschreiben einer geerbten Methode oder Eigenschaft.

Basisklasse und Unterklasse

Jede Klasse, die nicht von einer anderen Klasse erbt, wird automatisch zur Basisklasse (nicht zu verwechseln mit NSObject). Eine Unterklasse gibt den Elternteil mit einem Doppelpunkt nach ihrem Namen an. Wenn eine Unterklasse eine Methode des Elternteils überschreibt, muss sie super.method() aufrufen, um das Verhalten des Elternteils zu erhalten — dies ist eine Compiler-Anforderung.

Final-Klasse

Das Schlüsselwort final vor class verhindert die Vererbung. Der Compiler kann Methodenaufrufe einer final-Klasse durch statischen Dispatch optimieren, was die Leistung verbessert. Verwenden Sie final für Klassen, die nicht zur Erweiterung vorgesehen sind — es dokumentiert Ihre Absicht und beschleunigt den Code.

swift
// Beispiel für Klassenvererbung in Swift
class Vehicle {
    var speed: Double = 0

    func description() -> String {
        "Speed: \(speed) km/h"
    }
}

// Car erbt von Vehicle
class Car: Vehicle {
    var brand: String = "Unknown"

    override func description() -> String {
        "\(brand) - \(speed) km/h"
    }
}

// Final-Klasse — verhindert Vererbung
final class ElectricCar: Car {
    var batteryLevel: Double = 100
}

let tesla = ElectricCar()
tesla.brand = "Tesla"
tesla.speed = 120
print(tesla.description())  // "Tesla - 120.0 km/h"

Vererbung ist ein mächtiger, aber verantwortungsvoller Mechanismus. Tiefe Hierarchien (5+ Ebenen) erschweren Wartung und Tests. Für die funktionale Wiederverwendung ohne Vererbung verwenden Sie Protokolle mit Erweiterungen und protokollorientierter Programmierung — ein Ansatz, den Apple als Alternative zu tiefen Klassenhierarchien fördert.

Deinitialisierung und Speicherverwaltung

Swift verwendet ARC (Automatic Reference Counting) für die Speicherverwaltung von Klassen. Jede Klasseninstanz hat einen Zähler für starke Referenzen. Wenn eine neue starke Referenz erstellt wird, erhöht sich der Zähler; beim Zerstören verringert er sich. Wenn der Zähler Null erreicht, wird der Speicher freigegeben.

Deinit

Deinit — eine Methode, die automatisch vor der Freigabe einer Klasseninstanz aufgerufen wird. Sie gibt Ressourcen frei: schließt Dateien, meldet sich von Benachrichtigungen ab, stoppt Timer. Deinit ist nur für Klassen verfügbar — Strukturen und Aufzählungen haben es nicht.

Schwache und unbesessene Referenzen

Um starke Referenzzyklen (retain cycles) zu verhindern, bietet Swift weak und unowned Referenzen. Weak ist eine optionale Referenz, die automatisch nil wird, wenn das Objekt freigegeben wird. Unowned ist nicht optional, verweist aber auf ein Objekt, das garantiert länger lebt als der aktuelle Kontext. Ein typischer retain cycle tritt in einer Eltern-Kind-Beziehung auf: das Kind hält eine starke Referenz zum Elternteil.

swift
// Beispiel für ARC und schwache Referenz
class Parent {
    var name: String
    var child: Child?

    init(name: String) { self.name = name }
    deinit { print("\(name) freigegeben") }
}

class Child {
    var name: String
    weak var parent: Parent?   // weak verhindert retain cycle

    init(name: String) { self.name = name }
    deinit { print("\(name) freigegeben") }
}

var parent: Parent? = Parent(name: "Anna")
parent?.child = Child(name: "Mia")
parent?.child?.parent = parent

parent = nil  // Beide Objekte freigegeben!
// Ohne weak würde es einen retain cycle erzeugen

Verwenden Sie immer weak für Referenzen von einem Kindobjekt zum Elternteil und für Capture-Listen in Closures. Verwenden Sie unowned nur, wenn Sie sicher sind, dass das Objekt den aktuellen Kontext überlebt — die falsche Verwendung von unowned kann zu einem Absturz führen, wenn auf freigegebenen Speicher zugegriffen wird.

Class vs Struct: Hauptunterschiede

Die Wahl zwischen class und struct ist eine architektonische Entscheidung, die Leistung, Thread-Sicherheit und API-Design beeinflusst. Betrachten Sie die Tabelle der Hauptunterschiede, um in jedem Fall die richtige Entscheidung zu treffen.

Eigenschaftclassstruct
TypReferenztypWerttyp (Kopie)
SpeicherHeap + ARCStack / inlined
VererbungUnterstützt (ein Elternteil)Nicht unterstützt
DeinitVerfügbarNicht verfügbar
Identität (===)UnterstütztNicht unterstützt
MutatingNicht erforderlich (immer mutating)Nur mit mutating
Memberwise initNicht generiertAutomatisch generiert
Thread-SicherheitNicht garantiert (gemeinsamer Zustand)Garantiert (Kopie)

Verwenden Sie Klassen, wenn Sie gemeinsame Identität (mehrere Code-Teile arbeiten mit einem Objekt), Vererbung oder Interaktion mit Objective-C-Laufzeit benötigen. Für alles andere sind Strukturen vorzuziehen — sie sind schneller, sicherer in Multithread-Code und erfordern keine Speicherverwaltung.

Wann man class in Swift verwendet

Obwohl Apple empfiehlt, standardmäßig struct zu verwenden, sind Klassen in mehreren spezifischen Szenarien notwendig. Lassen Sie uns jedes mit praktischen Beispielen untersuchen.

UIKit- und AppKit-Komponenten

Alle UI-Komponenten in iOS und macOS sind Klassen, die von UIView (iOS) oder NSView (macOS) erben. Sie können UIViewController nicht durch eine struct ersetzen — er benötigt Vererbung und deinit, um Ressourcen freizugeben. Verwenden Sie bei der Arbeit mit UIKit Klassen für Controller, Views und deren Delegaten.

Singleton und gemeinsamer Zustand

Das Singleton-Muster (eine Klasseninstanz für die gesamte Anwendung) erfordert Referenzsemantik. Manager: NetworkManager, SettingsManager, AnalyticsService — werden typischerweise als Klassen mit einer gemeinsamen statischen Eigenschaft implementiert. Strukturen sind nicht geeignet, da jede Kopie eine unabhängige Instanz wäre.

Abhängigkeitsinjektion und Referenzobjekte

Wenn ein Objekt die einzige Quelle der Wahrheit sein muss und zwischen Modulen als Referenz übergeben wird — verwenden Sie class. Dies gilt für die Zustandsverwaltung, bei der eine Änderung eines Objekts an einer Stelle in allen abhängigen Komponenten sichtbar sein muss. Für ObservableObject in SwiftUI sind Klassen erforderlich.

swift
// ObservableObject — class für SwiftUI erforderlich
import SwiftUI

class AppViewModel: ObservableObject {
    @Published var isLoggedIn: Bool = false
    @Published var username: String = ""

    func login(user: String) {
        isLoggedIn = true
        username = user
    }
}

// Verwendung in einer SwiftUI View
struct ContentView: View {
    @StateObject var viewModel = AppViewModel()

    var body: some View {
        Text(viewModel.isLoggedIn ? "Willkommen" : "Anmelden")
    }
}

Regel: Wenn ein Objekt Identität haben muss (zwei Referenzen -> ein Objekt), eine einzelne Instanz sein soll oder mit UIKit/Objective-C arbeiten muss — wählen Sie class. Wenn ein Objekt einfach Daten enthält — wählen Sie struct.

Häufig gestellte Fragen

Was ist class in Swift?

Class ist ein Referenztyp in Swift, der Vererbung, Deinitialisierung und ARC für die Speicherverwaltung unterstützt. Klasseninstanzen werden im Heap gespeichert und Variablen enthalten eine Referenz auf das Objekt, nicht seine Kopie.

Wie unterscheidet sich class von struct in Swift?

Class — Referenztyp (wird als Referenz übergeben), unterstützt Vererbung und deinit. Struct — Werttyp (wird kopiert), unterstützt keine Vererbung, implementiert aber Protokolle und erhält automatisch memberwise init. Swift empfiehlt struct als Standardtyp.

Was ist ARC in Swift?

ARC (Automatic Reference Counting) — ein Speicherverwaltungsmechanismus für Swift-Klassen. Jede Instanz hat einen Zähler für starke Referenzen. Wenn der Zähler Null erreicht, wird der Speicher freigegeben. Weak und unowned Referenzen verhindern retain cycles zwischen Objekten.

Was ist deinit in Swift?

Deinit — eine Klassenmethode, die automatisch vor der Freigabe ihres Speichers aufgerufen wird. Wird zum Schließen von Dateien, Abmelden von Benachrichtigungen und anderen Bereinigungsvorgängen verwendet. Deinit ist nur in Klassen verfügbar — Strukturen haben es nicht.

Wann verwendet man class in Swift?

Verwenden Sie class für UIKit/AppKit UI-Komponenten, Singleton, ObservableObject in SwiftUI, Objekte mit gemeinsamer Identität (Delegate, Observer) und bei der Arbeit mit Objective-C-Laufzeit. Für Datenmodelle, DTOs und Konfigurationen wird struct bevorzugt.

Zusammenfassung

  • Class ist ein Referenztyp in Swift mit Referenzübergabe-Semantik: alle Variablen, die auf ein Objekt zeigen, sehen seinen aktuellen Zustand und können ihn ändern.
  • ARC verwaltet den Klassenspeicher durch Zählen starker Referenzen; weak und unowned verhindern retain cycles in Eltern-Kind-Beziehungen und Closures.
  • Vererbung ermöglicht es Klassen, das Verhalten des Elternteils wiederzuverwenden und zu überschreiben, aber tiefe Hierarchien (5+ Ebenen) erschweren die Codewartung.
  • Deinit wird ausgeführt, wenn ein Objekt freigegeben wird, und ist erforderlich, um Ressourcen freizugeben — Dateien, Timer, NotificationCenter-Abonnements.
  • UIKit und AppKit benötigen Klassen für alle UI-Komponenten — UIView, UIViewController, deren Delegaten und Datenquellen.
  • ObservableObject in SwiftUI — class ist erforderlich, da SwiftUI Änderungen über @Published und @StateObject als Referenz verfolgt.
  • Apple empfiehlt struct als Standardtyp für neue Datentypen — verwenden Sie class nur, wenn Identität, Vererbung oder Objective-C-Integration erforderlich ist.

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