Switch-Statements in Swift

Switch Statement in Swift sind wirklich mächtig. Die grundlegende Idee bieten auch andere Sprachen. Das Konzept ist aber deutlich erweitert worden. Unter Swift kannst Du bspw. auch Tuples als Fall verwenden. Alle Achtung – Java hat lange gebraucht bis dort einfache Strings erlaubt waren. Aber das ist noch nicht alles: Du kannst in jedem “case” ein oder mehrere Werte direkt an Variablen binden. Und richtig interessant wird es dann in Verbindung mit where-Bedingungen. Lies weiter um herauszufinden wie das funktioniert.

Switch-Statement Grundlagen

Um Dich und die anderen auf den gleichen Nenner zu bringen – eine kurze Erläuterung zum switch-Keyword. Du kannst damit Fallunterscheidungen umsetzen. Die Ausführung der Fälle (cases) ist an den Variablenwert geknüpft. In seiner einfachsten Form siehst das wie folgt aus:

Hier gibt es die Variable “einName”. Das switch-Konstrukt vergleicht nun den Inhalt der Variable Schritt für Schritt mit den definierten “cases”. Der erste Treffer zählt. Im ersten Test vergleicht das Beispiel “Jan” mit “Peter”. Der Vergleich scheitert. Dann wird der String “Jan” mit “Jan” verglichen. Der Fall trifft zu. Also wird der Code für den Fall “Jan” ausgeführt.

Wenn in “einName” weder der Wert “Peter” oder “Jan” stehen, wird der Standardfall ausgeführt (der “default”-Case). Das Konzept gibt es in anderen Sprachen auch. Dort ist er ein “default”-Case aber optional.

Swift vs. andere Sprachen

Es gibt ein paar Besonderheiten. Die sind besonders für Umsteiger auf Swift spannend. In Java oder auch C und Objective-C verhält sich die Logik anders.

Zum einen muss das Switch-Statement “exhaustive” sein. Das bedeutet für eine normale switch-Anweisung wie oben: Du musst einen “default”-Fall festlegen. Anders ausgedrückt: Es müssen alle Fälle abgedeckt werden. Bei konkreten Vergleichen gibt es theoretisch endlos viele Werte. Daher kann der Standardfall immer eintreten und muss abgefangen werden.

Auch die Verarbeitung ist anders. Hast Du Dich vielleicht bereits gefragt wo das “break” Keyword nach jeder Falldefinition ist? Das wird z.B. in Java genutzt um nicht weitere Fälle ausführen zu lassen. Ohne konkreten Abbruch wird auch jeder weitere Fall darunter ausgeführt. Das kann gewollt sein, ist aber eigentlich die Ausnahme. Genau das dachte sich scheinbar auch Apple. Das Ergebnis: Kein “implicit fallthrough” mehr, also ohne ausdrücklichen “Wunsch”. Um das Verhalten zu simulieren gibt es das fallthrough-Keyword:

Für den Fall 1 und 2 soll die gleiche Aktion erfolgen: Leider nicht gewonnen wird ausgegeben. Der Fall 3 wird wieder normal ausgeführt. Es ist allerdings auch nicht falsch mit break explizit auszusteigen. Erhöht gerade für Einsteiger die Lesbarkeit.

Tuples in Switch-Anweisungen

Auch das ist möglich und absolut legal: Tuples zur Fallunterscheidung. Im einfachsten Fall werden die konkreten Werte im Tuple abgefragt:

Damit kannst du schon einiges anstellen. Jetzt beginnt jedoch die Swift Show! Du kannst mit dem Range-Operator auch Wertebereiche festlegen:

Wenn nur das optimale Budget relevant ist kannst Du auch einzelne Werte “ausblenden” bzw. “ignorieren”:

Das ist aber noch nicht ganz rund. Wie wäre es, gleich auf Werte per Variablen zugreifen zu können? Die Antwort sind “value bindings”.

Value Bindings verwenden

Bei “value bindings” wird einfach einem Teil der Tuples eine Variable zugewiesen. Die kannst Du im “case”-Block dann verwenden:

Theoretisch können auch beide Werte im Tuple als Variable gelesen werden. Nur, dann gibt es keine Unterscheidung mehr. Das Switch-Konstrukt wäre überflüssig. Du kannst ja auch so auf die Elemente zugreifen. Aber was wäre, wenn es doch einen sinnvollen Weg zur Fallunterscheidung gäbe?

Where-Bedingungen

Das wäre nicht unglaublich – das ist es ist! Bei der Fallunterscheidung kannst Du where-Bedingungen festlegen! How awesome is that?! So kannst Du alle Werte an Variablen binden und zeitgleich verschiedene Varianten prüfen. Und so geht’s:

Awesomesauce! Der besseren Lesbarkeit zu Liebe kannst Du das “var”-Keyword einfach außerhalb der Klammer angeben. Theoretisch könntest Du auch “(var name, var age)” schreiben. Aber: Fallunterscheidung mit where. Wie genial!

Einen haben wir noch: Labeled Statements

Noch ein tolles Feature sind die labeled Statements. Die kannst du in Verbindung mit “break” super benutzen. Auch hier kurz zum Hintergrund: Du kannst damit aus einem switch-Statement “ausbrechen” und es beenden. Gleichzeitig kannst Du mittels break aber auch den Abbruch einer Schleife erzwingen. Was machst Du aber, wenn Deine switch-Anweisung in einer Schleife steht? Der Abbruch bezieht sich nicht mehr auf die Schleife, sondern auf das Switch-Konstrukt. Das folgende Beispiel zeigt es:

Wir durchlaufen eine Schleife. Die soll beendet werden, wenn der Zähler auf 18 steht. Aber: Hier kommst Du mittels “break” nur aus dem Switchblock heraus. Die Antwort sind “labeled Statements”:

Die Schleife hat nun einen Namen erhalten. Den kannst Du direkt beim Abbruch übergeben und gezielt “ausbrechen”. Durchaus interessant gelöst!

Fazit

Ich hoffe Dir gefallen die Switch-Statements genauso gut wie mir? Ich war schon ziemlich überrascht. Gerade die where Bedingung hat mich dann restlos überzeugt. Wie dem auch sei. Ich freue mich wirklich riesig über jede Form von Feedback. Selbst wenn Du nur kurz “Hallo” im Kommentar sagst find ich das total faszinierend.

Tags:

Kommentare (4)

  • Matthias

    3 Jahren ago

    WOW, da geht ja wirklich einiges! Danke für die tolle Übersicht!

    • Jan Brinkmann

      3 Jahren ago

      Ja, wirklich unglaublich geile Sachen in Swift. Gibt noch mehr solcher “Tweaks”. Da hat irgendwer schwer Punkte beim Mitdenken gesammelt. Vielen lieben Dank für den Kommentar! 😀

  • Uwe

    1 Jahr ago

    Wirklich ozeanisch dieses switch! Diese „labeled Statements” sind auch der Hammer! Wirklich gut in einem Artikel mal alles aufgelistet zu haben, erhöht den Durchblick mächtig gewaltig! Danke an den CodingTutor!

Schreib einen Kommentar

Your email address will not be published.