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:
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:
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:
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:
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:
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:
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:
let weekday = "Samstag"
switch weekday {
case "Samstag", "Sonntag":
print("Wochenende! 🎉")
case "Freitag":
print("Fast geschafft.")
default:
print("Arbeitstag.")
}So funktioniert switch:
- Nach
switchsteht der Wert, der geprüft wird. - Jedes
casenennt einen oder mehrere passende Werte, getrennt durch Kommas. - Swift führt den ersten passenden
caseaus und springt danach ans Ende. defaultfängt alles ab, was zu keinemcasepasst.
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:
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...100heißt: von 90 bis einschließlich 100.75..<90heiß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?
ifbei 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:
let isOnline = true
let status = isOnline ? "Online" : "Offline"
print(status) // OnlineLies 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:
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:
let hour = 20
let greeting = if hour < 12 {
"Guten Morgen"
} else if hour < 18 {
"Guten Tag"
} else {
"Guten Abend"
}
print(greeting) // Guten AbendJeder 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
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
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
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:
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
Ü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!
let temperature = 18
if temperature < 10 {
print("Es ist kalt")
} else if temperature < 25 {
print("Es ist angenehm")
} else {
print("Es ist heiß")
}Ü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!
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: 3Hier wird switch als Ausdruck verwendet. Mit einem klassischen switch und print in jedem Fall wäre die Lösung genauso richtig.
Ü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!
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
ifführt Code nur aus, wenn eine Bedingungtrueist.elseundelse ifergänzen weitere Fälle. Der erste passende gewinnt.switchvergleicht einen Wert mit vielen Möglichkeiten und muss vollständig sein.- Bereiche:
1...5(inklusive 5) und1..<5(ohne 5). - Ternärer Operator für kurze Entscheidungen:
bedingung ? a : b. - Geschweifte Klammern sind in Swift immer Pflicht.
Spickzettel
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" }