Lektion 1.4 · Stufe 1 – Swift-Fundament

Entscheidungen: if und switch

ca. 15 Minuten Lesezeit

Lernziel

Nach dieser Lektion kannst du mit if, else if und else Entscheidungen treffen, mit switch viele Fälle übersichtlich abarbeiten und mit dem ternären Operator ? : kurze Entscheidungen in einer Zeile schreiben.

Das Problem: Code, der immer dasselbe tut

Bisher läuft dein Code stur von oben nach unten. Jede Zeile wird ausgeführt, egal was passiert. Echte Programme müssen aber reagieren:

  • Ist das Passwort richtig? Dann einloggen, sonst Fehlermeldung zeigen.
  • Ist der Akku unter 20 %? Dann eine Warnung anzeigen.
  • Ist es Morgen, Mittag oder Abend? Dann passend grüßen.

Dafür brauchst du Entscheidungen, in der Fachsprache Kontrollfluss.

if: Wenn …, dann …

Die einfachste Entscheidung:

Swift
let battery = 15

if battery < 20 {
    print("Akku fast leer!")
}

So liest du das: „Wenn battery < 20 wahr ist, dann führe den Code in den geschweiften Klammern aus.“

Die Bedingung nach if muss immer einen Bool ergeben, also true oder false. Alles, was du in Lektion 1.3 über Vergleiche und &&, ||, ! gelernt hast, kannst du hier einsetzen.

Den Code in den geschweiften Klammern { } nennt man einen Block. Er wird eingerückt, damit man sofort sieht, was zur Bedingung gehört.

Tipp

Die geschweiften Klammern { und } tippst du auf der deutschen Mac-Tastatur mit ⌥ 8 und ⌥ 9. Du wirst sie ständig brauchen.

else: … sonst …

Soll etwas passieren, wenn die Bedingung nicht zutrifft, kommt else dazu:

Swift
let password = "geheim123"

if password == "geheim123" {
    print("Willkommen!")
} else {
    print("Falsches Passwort.")
}

Genau einer der beiden Blöcke wird ausgeführt, nie beide und nie keiner.

else if: Mehrere Möglichkeiten

Gibt es mehr als zwei Fälle, hängst du else if an:

Swift
let hour = 14

if hour < 12 {
    print("Guten Morgen!")
} else if hour < 18 {
    print("Guten Tag!")
} else {
    print("Guten Abend!")
}

Swift prüft die Bedingungen von oben nach unten und führt den ersten passenden Block aus. Danach ist Schluss, die restlichen Bedingungen werden nicht mehr geprüft.

Bei hour = 14: Ist 14 < 12? Nein. Ist 14 < 18? Ja → „Guten Tag!“. Das else wird übersprungen.

Die Reihenfolge zählt

Schreibst du die Bedingungen in der falschen Reihenfolge, kommt Unsinn heraus:

Swift
if hour < 18 {
    print("Guten Tag!")        // trifft auch um 8 Uhr zu!
} else if hour < 12 {
    print("Guten Morgen!")     // wird nie erreicht
}

Ordne Bedingungen deshalb vom speziellsten zum allgemeinsten Fall.

Bedingungen kombinieren

Natürlich kannst du auch komplexere Bedingungen verwenden:

Swift
let age = 16
let hasPermission = true

if age >= 18 || (age >= 16 && hasPermission) {
    print("Du darfst mitfahren.")
} else {
    print("Leider nicht.")
}

Wird eine Bedingung zu lang und unübersichtlich, gib ihr einen Namen:

Swift
let isAdult = age >= 18
let isTeenWithPermission = age >= 16 && hasPermission

if isAdult || isTeenWithPermission {
    print("Du darfst mitfahren.")
}

Das liest sich fast wie ein deutscher Satz. Genau so sollte guter Code sein.

switch: Viele Fälle übersichtlich

Bei vielen möglichen Werten werden if-else-Ketten schnell lang. Dafür gibt es switch:

Swift
let weekday = "Samstag"

switch weekday {
case "Samstag", "Sonntag":
    print("Wochenende! 🎉")
case "Freitag":
    print("Fast geschafft.")
default:
    print("Arbeitstag.")
}

So funktioniert switch:

  • Nach switch steht der Wert, der geprüft wird.
  • Jedes case nennt einen oder mehrere passende Werte, getrennt durch Kommas.
  • Swift führt den ersten passenden case aus und springt danach ans Ende.
  • default fängt alles ab, was zu keinem case passt.

switch muss vollständig sein

Swift verlangt, dass jeder mögliche Wert abgedeckt ist. Bei einem String gibt es unendlich viele mögliche Werte, deshalb ist default hier Pflicht. Fehlt es, meldet Xcode:

Fehlermeldung

Switch must be exhaustive

Diese Strenge wirkt lästig, ist aber Gold wert. In Lektion 1.14 lernst du Enums kennen. Dort sorgt sie dafür, dass du keinen Fall vergessen kannst.

Bereiche mit switch

switch kann auch ganze Zahlenbereiche prüfen:

Swift
let score = 87

switch score {
case 90...100:
    print("Sehr gut")
case 75..<90:
    print("Gut")
case 50..<75:
    print("Bestanden")
default:
    print("Nicht bestanden")
}
  • 90...100 heißt: von 90 bis einschließlich 100.
  • 75..<90 heißt: von 75 bis ausschließlich 90, also 75 bis 89.

Diese Bereiche (englisch ranges) brauchst du auch in der nächsten Lektion bei den Schleifen.

if oder switch?

  • if bei ein bis zwei Bedingungen oder wenn verschiedene Werte geprüft werden.
  • switch, wenn ein Wert mit vielen Möglichkeiten verglichen wird.

Der ternäre Operator: Entscheidung in einer Zeile

Oft willst du nur zwischen zwei Werten wählen. Dafür gibt es eine Kurzform:

Swift
let isOnline = true
let status = isOnline ? "Online" : "Offline"
print(status)   // Online

Lies das so: „Ist isOnline wahr? Dann "Online", sonst "Offline".“

Das Muster ist immer: Bedingung ? WertWennWahr : WertWennFalsch

Diese Schreibweise wirst du in SwiftUI sehr oft sehen, zum Beispiel für einen Button, dessen Beschriftung sich ändert:

Swift
Button(showsDetails ? "Weniger anzeigen" : "Mehr anzeigen") { ... }

Achtung

Der ternäre Operator ist für kurze Entscheidungen gedacht. Verschachtelst du mehrere davon ineinander, wird der Code unlesbar. Nimm dann lieber if oder switch.

if und switch als Ausdruck

In modernem Swift können if und switch auch direkt einen Wert liefern:

Swift
let hour = 20

let greeting = if hour < 12 {
    "Guten Morgen"
} else if hour < 18 {
    "Guten Tag"
} else {
    "Guten Abend"
}

print(greeting)   // Guten Abend

Jeder Zweig enthält dann nur einen einzelnen Wert. Das ist praktisch, um eine Konstante mit let anzulegen, deren Wert von einer Bedingung abhängt.

Typische Fehler

Geschweifte Klammern vergessen

Swift
if battery < 20
    print("Akku fast leer!")

Fehlermeldung

Expected '{' after 'if' condition

In Swift sind die geschweiften Klammern immer Pflicht, auch bei nur einer Zeile.

Bedingung ist kein Bool

Swift
let count = 5
if count {
    print("Es gibt Einträge")
}

Fehlermeldung

Type 'Int' cannot be used as a boolean; test for '!= 0' instead

In manchen Sprachen gilt jede Zahl außer 0 als „wahr“. In Swift nicht. Schreib ausdrücklich, was du meinst: if count > 0.

default fehlt

Fehlermeldung

Switch must be exhaustive

Dein switch deckt nicht alle möglichen Werte ab. Ergänze einen default-Fall.

Ein case ohne Inhalt

Swift
switch weekday {
case "Montag":
case "Dienstag":
    print("Start der Woche")
default:
    break
}

Fehlermeldung

'case' label in a 'switch' must have at least one executable statement

Anders als in vielen anderen Sprachen „fällt“ Swift nicht automatisch in den nächsten Fall. Fasse die Werte zusammen: case "Montag", "Dienstag":. Und wenn ein Fall bewusst nichts tun soll, schreib break hinein, wie im default oben.

FAQ

Anfänger

Was bedeutet das überhaupt?

Muss ich immer ein else schreiben? Nein. Ein else brauchst du nur, wenn im anderen Fall auch etwas passieren soll.

Wie viele else if darf ich hintereinander schreiben? So viele du willst. Ab etwa drei oder vier wird switch aber meist übersichtlicher.

Warum rückt Xcode den Code ein? Damit man sieht, welche Zeilen zu welchem Block gehören. Swift selbst ist die Einrückung egal, aber für Menschen ist sie entscheidend. Mit ⌃ I rückt Xcode markierten Code automatisch richtig ein.

Fortgeschritten

Warum verhält es sich so?

Kann switch auch Bedingungen prüfen, nicht nur Werte? Ja, mit where:

Swift
switch age {
case let x where x < 0:
    print("Ungültiges Alter")
case 0..<18:
    print("Minderjährig")
default:
    print("Volljährig")
}

case let x where ... heißt: „Nimm den Wert, nenn ihn x, und prüf die Bedingung.“

Was ist fallthrough? Damit springt Swift nach einem case ausdrücklich in den nächsten. Man braucht es sehr selten. Meist ist ein Komma zwischen mehreren Werten die bessere Lösung.

Profi

Was passiert unter der Haube?

Warum ist ein vollständiges switch so wertvoll? Weil der Compiler zum Wächter deiner Logik wird. Kommt später ein neuer Fall hinzu, etwa ein neuer Wert in einem Enum, meldet Xcode jede Stelle, an der dieser Fall noch nicht behandelt wird. Deshalb gilt bei Enums: Lieber jeden Fall einzeln aufführen als default verwenden. Sonst geht diese Prüfung verloren.

Ist ein switch schneller als eine if-Kette? Bei einfachen Werten kann der Compiler ein switch oft effizienter umsetzen. In App-Code ist das aber praktisch nie entscheidend. Wähle nach Lesbarkeit.

Übungen

Anfänger

Übung 1: Temperatur

Leg eine Konstante temperature an. Gib „Es ist kalt“ aus, wenn sie unter 10 Grad liegt, „Es ist angenehm“ bis unter 25 Grad und sonst „Es ist heiß“.

Lösung Übung 1Erst selbst probieren!
Swift
let temperature = 18

if temperature < 10 {
    print("Es ist kalt")
} else if temperature < 25 {
    print("Es ist angenehm")
} else {
    print("Es ist heiß")
}
Fortgeschritten

Übung 2: Notenrechner

Wandle eine Punktzahl von 0 bis 100 mit switch in eine österreichische Schulnote um: ab 90 → 1, ab 80 → 2, ab 65 → 3, ab 50 → 4, darunter → 5. Speichere die Note in einer Konstante grade und gib sie aus.

Lösung Übung 2Erst selbst probieren!
Swift
let points = 72

let grade = switch points {
case 90...100: 1
case 80..<90: 2
case 65..<80: 3
case 50..<65: 4
default: 5
}

print("Note: \(grade)")   // Note: 3

Hier wird switch als Ausdruck verwendet. Mit einem klassischen switch und print in jedem Fall wäre die Lösung genauso richtig.

Profi

Übung 3: Schaltjahr

Ein Jahr ist ein Schaltjahr, wenn es durch 4 teilbar ist, außer es ist durch 100 teilbar, es sei denn, es ist auch durch 400 teilbar. Schreib einen Ausdruck isLeapYear und teste ihn mit 2024 (ja), 1900 (nein) und 2000 (ja).

Lösung Übung 3Erst selbst probieren!
Swift
let year = 1900

let isLeapYear = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0
print("\(year) ist ein Schaltjahr: \(isLeapYear)")

Der Trick: Die Ausnahme von der Ausnahme wird mit || angehängt.

Zusammenfassung

  • if führt Code nur aus, wenn eine Bedingung true ist.
  • else und else if ergänzen weitere Fälle. Der erste passende gewinnt.
  • switch vergleicht einen Wert mit vielen Möglichkeiten und muss vollständig sein.
  • Bereiche: 1...5 (inklusive 5) und 1..<5 (ohne 5).
  • Ternärer Operator für kurze Entscheidungen: bedingung ? a : b.
  • Geschweifte Klammern sind in Swift immer Pflicht.

Spickzettel

Swift
if x > 0 { ... } else if x == 0 { ... } else { ... }

switch value {
case 1, 2:      ...
case 3...10:    ...
default:        ...
}

let text = isOn ? "An" : "Aus"
let label = if x > 0 { "positiv" } else { "nicht positiv" }

Lektion geschafft?

Markiere sie als erledigt, damit du deinen Fortschritt siehst.