Swift ist eine moderne Programmiersprache von Apple, die auf der WWDC 2014 als Nachfolger von Objective-C vorgestellt wurde. Swift vereint Typsicherheit, automatische Speicherverwaltung ARC (Automatic Reference Counting) und einen protokollorientierten Ansatz. Swift Programming Language ist die primäre Quelle für die Syntax und die Standardbibliothek der Sprache.
Wichtigste Punkte
Swift ist eine multiparadigmatische Programmiersprache, die von Apple für iOS, macOS, watchOS, tvOS und visionOS entwickelt wurde. Die Hauptziele der Sprache sind: Sicherheit, Geschwindigkeit und syntaktische Ausdrucksstärke. Swift verwendet den LLVM-Compiler und erzeugt optimierten Maschinencode, der in der Leistung mit C++ vergleichbar ist.
Seit seiner Veröffentlichung im Jahr 2014 hat Swift 6 Hauptversionen durchlaufen. Swift 6 (2024) führte ein vollständiges Datenwettlaufsicherheitsmodell durch strenge Kontrolle der Nebenläufigkeitsisolierung ein. Laut GitHub Octoverse 2025 gehört Swift zu den 10 Sprachen mit dem stärksten Community-Wachstum und übertrifft Rust und Kotlin in der Geschwindigkeit der Adoption auf Apple-Plattformen.
Swift ist Open Source und plattformübergreifend — der Quellcode ist auf GitHub (Swift Open Source) veröffentlicht. Neben Apple-Plattformen wird Swift auf Linux und Windows für die Serverentwicklung (Vapor, Hummingbird) eingesetzt, obwohl sein Hauptbereich die mobile und Desktop-Entwicklung im Apple-Ökosystem bleibt.
Die Hauptgründe für den Übergang: Swift eliminiert ganze Klassen von Fehlern, die in Objective-C möglich sind. Typsicherheit verhindert Typkonflikte zur Kompilierzeit. Optionals eliminieren nil-Dereferenzierungen. ARC ist von Anfang an integriert, anders als MRC/ARC in Objective-C. Die Swift-Syntax ist kürzer und lesbarer — Studien zeigen eine Reduzierung des Codevolumens um 30-40% im Vergleich zu Objective-C bei gleichwertigen Aufgaben.
Die grundlegende Swift-Syntax kombiniert vertraute C-ähnliche Konstrukte mit Elementen funktionaler Sprachen. Variablen werden mit var deklariert, Konstanten mit let. Der Compiler verwendet Typinferenz, daher ist eine explizite Typannotation nur bei Mehrdeutigkeit erforderlich.
import Foundation
// Konstanten und Variablen
let name = "Swift"
var version = 6.0
var count: Int = 42
// Funktionen mit Standardparametern
func greet(person: String, greeting: String = "Hello") -> String {
return "\(greeting), \(person)!"
}
// Guard-let für frühes Beenden
func parse(input: String?) -> Int {
guard let value = input, let number = Int(value) else {
return 0
}
return number
}Switch und Pattern Matching sind in Swift leistungsfähiger als in C und Kotlin. Switch unterstützt Abgleich mit Tupeln, Bereichen, where-Bedingungen und Wertbindung. Der Compiler prüft die erschöpfende Abdeckung aller Fälle — das Fehlen von default ist kein Fehler, wenn alle möglichen Werte abgedeckt sind.
let point = (x: 3, y: -1)
switch point {
case (0, 0):
print("Ursprung")
case let (x, y) where x == y:
print("X ist gleich Y")
case let (x, y) where abs(y) > x:
print("Der Absolutwert von Y ist größer als X")
default:
print("Punkt (\(point.x), \(point.y))")
}Optionals sind ein zentrales Konzept von Swift, das das Nullreferenzproblem auf der Ebene des Typsystems löst. Optional
var optionalString: String? = "Hello"
optionalString = nil // erlaubt
// Optional Binding — sicheres Entpacken
if let text = optionalString {
print("Text: \(text)")
} else {
print("Wert nicht vorhanden")
}
// Optional Chaining — sicherer Eigenschaftszugriff
let length = optionalString?.count ?? 0
// Nil-coalescing-Operator
let greeting = optionalString ?? "Default"Optional Chaining mit dem ?.-Operator ermöglicht das sichere Aufrufen von Methoden und den Zugriff auf Eigenschaften eines optionalen Werts. Wenn die Kette durch nil unterbrochen wird, ist das Ergebnis des gesamten Ausdrucks nil. Nil-coalescing (??) bietet einen Standardwert und wird häufig im UI-Code zur Anzeige von Platzhaltertext verwendet.
Protokolle definieren in Swift einen Vertrag — eine Reihe von Eigenschaften und Methoden. Im Gegensatz zu Java-Schnittstellen können Swift-Protokolle über Protokollerweiterungen (protocol extensions) Standardimplementierungen haben. Dies ist die Grundlage der protokollorientierten Programmierung, dem von Apple empfohlenen Ansatz anstelle von Klassenvererbung.
protocol NamedEntity {
var name: String { get }
func description() -> String
}
// Standardimplementierung via extension
extension NamedEntity {
func description() -> String {
return "Entity: \(name)"
}
}
// Konformität via extension
extension String: NamedEntity {
var name: String { return self }
}Protocol Extensions ermöglichen das Hinzufügen von Methoden zu einem Protokoll, ohne jeden konformen Typ zu ändern. Dies ist besonders nützlich zum Hinzufügen gemeinsamer Dienstprogramme: map, filter, reduce für Sequence oder Codable für die JSON-Serialisierung. Apple hat viele Frameworks (SwiftUI, Combine) auf Protokollen mit Erweiterungen aufgebaut.
Closures in Swift sind anonyme Funktionen, die Variablen aus dem äußeren Kontext erfassen (capture). Syntaktisch ähneln Closures den Lambdas in Kotlin, haben aber eine flexiblere Syntax: Trailing Closure, Kurzargumentnamen ($0, $1) und Autoclosures.
// Closure mit Kontexterfassung
let numbers = [5, 3, 8, 1, 9]
// Trailing closure syntax
let sorted = numbers.sorted { $0 < $1 }
// Funktionale Kette
let result = numbers
.filter { $0 > 3 }
.map { $0 * 2 }
.reduce(0, +)
// Closure als Funktionsparameter
func performAsync(completion: @escaping (Result<Data, Error>) -> Void) { }@escaping Closures werden verwendet, wenn das Closure nach der Rückkehr der Funktion ausgeführt wird — typisch für Netzwerkanfragen und asynchrone Operationen. @autoclosure kapselt automatisch einen Ausdruck in ein Closure und wird in assert und Kurzschlusslogik verwendet.
Die Wahl zwischen struct und class ist eine der ersten Entscheidungen beim Entwurf eines Swift-Modells. Apple empfiehlt, standardmäßig struct (Wertetyp) zu verwenden und nur dann zu class (Referenztyp) zu wechseln, wenn Vererbung oder Referenzidentität erforderlich ist.
| Merkmal | Struct | Class |
|---|---|---|
| Übergabetyp | Nach Wert (Kopie) | Nach Referenz |
| Vererbung | Nicht unterstützt | Unterstützt |
| ARC-Verwaltung | Nicht erforderlich | ARC (Referenzzählung) |
| Deinitialisierer deinit | Nein | Ja |
| Veränderbarkeit | mutating func zum Ändern von Eigenschaften | Jede Methode kann ändern |
| Speicherung in Sammlungen | Wird beim Einfügen kopiert | Referenz wird gespeichert |
Wertetypen (struct) sind in Multithread-Umgebungen sicherer — jeder Thread erhält eine unabhängige Kopie. Referenztypen (class) sind für die Arbeit mit UIKit (UIView, UIViewController) erforderlich, wo Referenzidentität und Vererbung von Systemklassen benötigt werden.
ARC (Automatic Reference Counting) ist das Speicherverwaltungssystem von Swift für Referenztypen. Der Compiler fügt zur Laufzeit retain/release-Aufrufe ein und verfolgt die Anzahl der starken Referenzen auf ein Objekt. Wenn der Zähler Null erreicht, wird das Objekt sofort freigegeben.
Das Hauptproblem von ARC sind Retain Cycles (zyklische Referenzen). Wenn zwei Objekte starke Referenzen aufeinander halten, wird der Speicher nie freigegeben. Die Lösung sind schwache Referenzen (weak, werden bei Freigabe automatisch nil) und unowned-Referenzen (garantieren, dass das Objekt lebt).
class ProfileViewController: UIViewController {
var onLogout: (() -> Void)?
func setupHandler() {
// [weak self] verhindert Retain Cycle
onLogout = { [weak self] in
guard let self else { return }
self.dismiss(animated: true)
}
}
}Um Retain Cycles in Closures zu verhindern, verwenden Sie [weak self] mit guard let self = self else { return }. Diese Regel ist besonders wichtig in UIKit, wo ViewController starke Referenzen auf seine Eigenschaften hält und die Closures innerhalb dieser Eigenschaften auf den ViewController verweisen.
Häufig gestellte Fragen
Swift unterstützt Int, Double, Float, String, Bool, Array, Set, Dictionary und Tupel. Numerische Typen haben eine feste Größe: Int8, Int16, Int32, Int64 und vorzeichenlose UInt. Für die Arbeit mit Datumsangaben wird Date aus Foundation verwendet, für Daten — Data.
Optional ist ein Enum mit zwei Fällen: .none (nil) und .some(Wrapped). Swift erfordert eine explizite Optional-Prüfung via if let, guard let oder ??, was NullPointerException ausschließt. Optionale Ketten (?.) ermöglichen den sicheren Zugriff auf Eigenschaften von verschachtelten optionalen Werten.
Struct — Wertetyp, wird bei Zuweisung kopiert, unterstützt keine Vererbung, benötigt kein ARC. Class — Referenztyp, wird per Referenz übergeben, unterstützt Vererbung und Deinitialisierer. Apple empfiehlt struct als Standardtyp.
ARC zählt automatisch die starken Referenzen auf Klassenobjekte. Wenn der Zähler Null erreicht, wird der Speicher freigegeben. Um zyklische Referenzen zu verhindern, verwenden Sie weak (automatisches nil) und unowned (garantierte Lebensdauer). ARC gilt nicht für struct und enum.
Protokollorientierte Programmierung ist ein Ansatz, der Protokolle mit Erweiterungen anstelle von Klassenhierarchien verwendet. Protokolle können über Protokollerweiterungen Standardimplementierungen von Methoden enthalten. Dies ermöglicht die Wiederverwendung von Code ohne Vererbung und bewahrt Flexibilität und Testbarkeit.
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