Das CaseIterable-Protokoll für Enumeration in Swift


Im Unterschied zu enum-Typen in anderen Programmiersprachen sind die Enumerationen in Swift flexibler einsetzbar, denn sie sind mehr, als nur Aufzählungen von Werten. In Swift kann eine Enumeration Methoden enthalten und ermöglicht somit zusätzliche Möglichkeiten bei der Entwicklung. Folgt ein enum dem CaseIterable-Protokoll können alle Werte sogar leicht mit einer Schleife durchlaufen werden.

Eine besondere Programmierung ist zur Implementierung des CaseIterable-Protokolls nicht erforderlich. Es genügt, das Protokoll bei der Definition des enum anzugeben. Alles Weitere geschieht automatisch. Für eine Iteration über alle Werte stehen mehrere Möglichkeiten zur Verfügung. Eine For-Schleife oder die forEach-Methode. Das Ergebnis ist in beiden Fällen identisch.

enum ElementsCaseIterable {

    case Hydrogen

    case Helium

    case Carbon

    case Oxygen

    case Iron

    case Copper

    case Gold

    case Uranium

    case Plutonium

}


Elements.Helium < Elements.Gold // true

Elements.Oxygen > Elements.Iron // false

Elements.Uranium < Elements.Plutonium // true


// Iteration mit einer For-Schleife

for element in Elements.allCases {

    print(element)

}


// Iteration mit der forEach-Methode

Elements.allCases.forEach { print($0) } 

Enumerationen sind eine große Hilfe, um typsicher zu programmieren. Außerdem wird durch ihre aussagekräftigen Namen, sofern sie verwendet werden, der Code besser lesbar. Gibt es für eine Eigenschaft nur eine begrenzte Anzahl an möglichen Werten, ist es immer eine gute Idee, ein enum zu verwenden. Alternativen wie int oder string würde die Zuweisung von falschen Werten erlauben, wodurch Fehler erst zu Laufzeit der Anwendung aufträten. Eine falsche Zuweisung bei einer enum-Wert würde der Compiler jedoch entdecken.

Soll der Wert eines enum für den Benutzer angezeigt werden ist in vielen Programmiersprachen ein wenig Aufwand nötig. Selten möchte man den den Anwender mit der Bezeichnung konfrontieren, die im Programmcode verwendet wird. Spezielle Methoden zur Konvertierung des Wertes in eine ansprechende Bezeichnung sind erforderlich. Das ist in Swift nicht anders, jedoch kann diese Methode direkt im enum hinterlegt werden.

enum ElementsCaseIterable {

    case Hydrogen

    case Helium

    case Carbon

    case Oxygen

    case Iron

    case Copper

    case Gold

    case Uranium

    case Plutonium

    

    var displayText : String {

        switch self {

        case .Hydrogen:

            return "Wasserstoff"

        case .Helium:

            return "Helium"

        case .Carbon:

            return "Kohlenstoff"

        case .Oxygen:

            return "Sauerstoff"

        case .Iron:

            return "Eisen"

        case .Copper:

            return "Kupfer"

        case .Gold:

            return "Gold"

        case .Uranium:

            return "Uran"

        case .Plutonium:

            return "Plutonium"

        }

    }

}



// Iteration mit einer For-Schleife

for element in Elements.allCases {

    print(element.displayText)

}


// Ausgabe einer Bezeichnung

print(Elemen

In Swift muss eine switch-case Struktur alle Fälle abdecken, sie muss »exhaustive« sein, wie es in englischen Dokumentationen heißt. Erschöpfend. Durch diesen Umstand kommt es sofort zu einer Fehlermeldung vom Compiler, wenn der Enumeration ein weiterer Fall hinzugefügt wird, diese aber nicht in der displayText-Methode behandelt wird.


Geschrieben am: 23.03.2021
Technologien: Swift, SwiftUI, macOS, iOS