Swiftlang
Art
Lektion 6 von 12
Niveau
Grundlagen
Lesezeit
etwa 3 Minuten
Stand

Optionals in Swift verstehen

Ein Optional ist ein Wert, der fehlen kann. String? bedeutet „entweder ein String oder nil“. Swift zwingt dich, diesen Fall zu behandeln, bevor du den Wert verwendest. Dafür gibt es if let, guard let, den Operator ?? für einen Ersatzwert und Optional Chaining mit ?. Das Ausrufezeichen entpackt ohne Prüfung und beendet das Programm, wenn kein Wert da ist.

Danach kannst du

  • erkennst, wann ein Wert ein Optional ist und warum
  • entpackst Optionals mit if let, guard let, ?? und Optional Chaining
  • weißt, wann ! vertretbar ist und wann nicht
  • liest die Compiler-Meldung zu nicht entpackten Optionals

Voraussetzungen

Umgebung

Swift 6.4.0, Sprachmodus 6
plattformunabhängig, geprüft unter Linux x86-64

Die Kurzform if let name (ohne = name) gibt es seit Swift 5.7.

Was ein Optional ist

In vielen Sprachen kann jeder Verweis „nichts“ enthalten: null in Java, None in Python, nil in Objective-C. Ob ein Wert fehlen kann, sieht man dem Code dort nicht an. Vergisst man die Prüfung, kracht es zur Laufzeit.

Swift macht diese Möglichkeit zum Teil des Typs. Ein String enthält immer einen Text. Ein String? enthält einen Text oder nil. Der Compiler lässt dich einen String? nicht wie einen String verwenden:

nicht-entpackt.swiftKompiliert absichtlich nicht Meldung von Swift 6.4.0, Linux x86-64, 19.10.2026
let eingabe: String? = "Swift"
let laut = eingabe.uppercased()

Compiler-Meldung

nicht-entpackt.swift:2:12: error: value of optional type 'String?' must be unwrapped to refer to member 'uppercased' of wrapped base type 'String'
1 | let eingabe: String? = "Swift"
2 | let laut = eingabe.uppercased()
  |            |- error: value of optional type 'String?' must be unwrapped to refer to member 'uppercased' of wrapped base type 'String'
  |            |- note: chain the optional using '?' to access member 'uppercased' only for non-'nil' base values
  |            `- note: force-unwrap using '!' to abort execution if the optional value contains 'nil'
3 |

Die Meldung ist lang, aber präzise. Das Problem: eingabe ist ein String?, und uppercased() gibt es nur für String. Die beiden note-Zeilen sind die zwei schnellsten Lösungen, und nur die erste ist ungefährlich. Die sicheren Wege lernst du jetzt.

Vier Wege zum Wert

grundlagen.swiftAusgeführt Swift 6.4.0, Linux x86-64, 19.10.2026
var spitzname: String? = nil
print(spitzname as Any)

spitzname = "Swifty"

// 1. if let: nur ausführen, wenn ein Wert da ist
if let spitzname {
    print("Hallo, \(spitzname)!")
}

// 2. guard let: früh aussteigen, danach ist der Wert sicher
func laenge(von text: String?) -> Int {
    guard let text else { return 0 }
    return text.count
}
print(laenge(von: nil), laenge(von: "Optional"))

// 3. ?? liefert einen Ersatzwert
let anzeige = spitzname ?? "Gast"
print(anzeige)

// 4. Optional Chaining: die ganze Kette wird zum Optional
let erstesZeichen = spitzname?.first?.uppercased()
print(erstesZeichen ?? "-")

Ausgabe

nil
Hallo, Swifty!
0 8
Swifty
S

1. if let entpackt den Wert in einen neuen Namen, der nur im Block gilt. Ist das Optional nil, wird der Block übersprungen. Seit Swift 5.7 darfst du if let spitzname statt if let spitzname = spitzname schreiben (SE-0345).

2. guard let entpackt und steigt aus, wenn kein Wert da ist. Danach gilt der entpackte Name bis zum Ende der Funktion. Das ist die übliche Form am Anfang einer Funktion, die ohne den Wert nichts Sinnvolles tun kann.

3. ?? liefert den Wert oder einen Ersatz. Das Ergebnis ist kein Optional mehr. Ideal für Anzeigetexte und Standardwerte.

4. Optional Chaining mit ?. ruft eine Eigenschaft oder Methode nur auf, wenn ein Wert da ist. spitzname?.first?.uppercased() geht drei Schritte; scheitert einer, ist das Ergebnis der ganzen Kette nil. Deshalb ist auch das Ergebnis wieder ein Optional, das hier mit ?? aufgelöst wird.

print(spitzname as Any) in der ersten Zeile unterdrückt nur eine Warnung: print mit einem Optional ist erlaubt, aber meist ein Versehen, und der Compiler weist dich darauf hin.

Optionals im Alltag

praxis.swiftAusgeführt Swift 6.4.0, Linux x86-64, 19.10.2026
// Typische Quellen für Optionals im Alltag
let eingaben = ["12", "sieben", "40"]

// Int(_:) scheitert bei Text, der keine Zahl ist
let zahlen = eingaben.compactMap { Int($0) }
print(zahlen)

// Suchen kann erfolglos sein
let position = eingaben.firstIndex(of: "40")
print(position.map { "gefunden an Index \($0)" } ?? "nicht gefunden")

// Mehrere Optionals auf einmal entpacken
let breite = Int("1920")
let hoehe = Int("1080")
if let breite, let hoehe {
    print("Auflösung: \(breite) × \(hoehe)")
}

// switch auf ein Optional
let antwort: Int? = Int("42")
switch antwort {
case .some(let wert) where wert > 40:
    print("groß: \(wert)")
case .some(let wert):
    print("klein: \(wert)")
case .none:
    print("keine Zahl")
}

Ausgabe

[12, 40]
gefunden an Index 2
Auflösung: 1920 × 1080
groß: 42
  • compactMap wandelt jedes Element um und wirft die nil-Ergebnisse weg. Aus drei Eingaben werden zwei Zahlen.
  • Optional.map wandelt den Wert um, wenn einer da ist, und lässt nil sonst durch. Hier wird aus einer Position ein Satz.
  • Mehrere Optionals entpackst du in einem if let, getrennt durch Komma. Der Block läuft nur, wenn alle einen Wert haben.
  • Ein Optional ist ein Enum mit den Fällen .some(Wert) und .none. Deshalb funktioniert switch darauf, inklusive where.

Das Ausrufezeichen

! hinter einem Optional heißt „Force Unwrap“: Entpacken ohne Prüfung. Ist kein Wert da, beendet Swift das Programm sofort:

erzwungen.swiftBricht absichtlich ab Ausgeführt mit Swift 6.4.0, Linux x86-64, 19.10.2026
let alter = Int("zweiundvierzig")
print(alter! + 1)

Abbruch zur Laufzeit

erzwungen.swift:2: Fatal error: Unexpectedly found nil while unwrapping an Optional value

Das ist kein Fehler von Swift, sondern Absicht. Der Abbruch passiert genau an der Stelle, an der deine Annahme falsch war, statt dass ein fehlender Wert unbemerkt weiterwandert.

Wann ist ! vertretbar? Wenn der Wert aus Gründen, die der Compiler nicht kennt, garantiert da ist, und ein fehlender Wert ein Programmierfehler wäre, den du sofort sehen willst. Beispiele sind feste Werte im eigenen Code oder Testcode. Für alles, was von außen kommt, Eingaben, Dateien, Netzwerk, nimmst du if let, guard let oder ??. Kommt dein Programm ohne ein einziges ! aus, ist das kein Zufall, sondern ein gutes Zeichen.

Häufige Fehler

value of optional type 'String?' must be unwrapped to refer to member …. Du verwendest ein Optional wie einen normalen Wert. Entpacke es vorher.

value of optional type 'Int?' must be unwrapped to a value of type 'Int'. Dasselbe beim Rechnen, oft nach einem Dictionary-Zugriff. (lager["Äpfel"] ?? 0) + 10 löst es.

Fatal error: Unexpectedly found nil while unwrapping an Optional value. Ein ! hat nil getroffen. Ersetze es durch eine sichere Variante.

initializer for conditional binding must have Optional type. Du schreibst if let mit einem Wert, der gar kein Optional ist. Dann brauchst du kein if let.

Übungen

  1. Schreibe eine Funktion alterInJahren(_ eingabe: String) -> String, die eine Eingabe wie „42“ in „42 Jahre“ verwandelt und bei ungültiger Eingabe „Bitte gib eine Zahl ein.“ liefert. Nutze guard let.
  2. Gegeben ist let einstellungen: [String: String] = ["sprache": "de"]. Lies die Einträge sprache und thema aus und gib sie aus, mit dem Standardwert „hell“ für ein fehlendes Thema.
Lösung zu Übung 1
loesung-1.swiftAusgeführt Swift 6.4.0, Linux x86-64, 19.10.2026
func alterInJahren(_ eingabe: String) -> String {
    guard let jahre = Int(eingabe) else {
        return "Bitte gib eine Zahl ein."
    }
    return "\(jahre) Jahre"
}

print(alterInJahren("42"))
print(alterInJahren("zweiundvierzig"))

Ausgabe

42 Jahre
Bitte gib eine Zahl ein.
Lösung zu Übung 2
loesung-2.swiftAusgeführt Swift 6.4.0, Linux x86-64, 19.10.2026
let einstellungen: [String: String] = ["sprache": "de"]

let sprache = einstellungen["sprache"] ?? "en"
let thema = einstellungen["thema"] ?? "hell"
print("Sprache: \(sprache), Thema: \(thema)")

Ausgabe

Sprache: de, Thema: hell