W Swift konstrukcja switch wspiera rozszerzone dopasowywanie wzorców: możesz używać where, aby dodać warunki do poszczególnych case. Umożliwia to realizację złożonej logiki biznesowej i filtrowania.
Przykład:
enum Osoba { case student(wynik: Int) case nauczyciel(specjalność: String) } let ludzie = [Osoba.student(wynik: 95), Osoba.nauczyciel(specjalność: "Matematyka"), Osoba.student(wynik: 65)] for osoba in ludzie { switch osoba { case .student(let wynik) where wynik > 90: print("Wybitny uczeń z wynikiem \(wynik)") case .nauczyciel(let specjalność): print("Nauczyciel przedmiotu: \(specjalność)") default: print("Inny przypadek") } }
Użycie where zwiększa czytelność i unika powielania kodu, ale zbyt skomplikowane warunki mogą pogorszyć wsparcie, a dopasowywanie wzorców z powiązanymi wartościami wymaga ścisłej kontroli kolejności case’ów.
Pytanie: "Czy przy dopasowywaniu wzorców z where w switch obowiązkowe jest wywoływanie zmiennych z unikalnymi nazwami w każdym case?"
Odpowiedź: Nie, ale to jest zalecane, aby uniknąć zamieszania. Jeśli użyjesz takich samych nazw zmiennych w różnych case, kontekst będzie ograniczony do odpowiedniego case, ale ta sama nazwa może utrudniać czytelność i utrzymanie kodu.
Przykład:
switch wartość { case .status(let kod) where kod == 200: print("OK") case .status(let kod) where kod == 404: print("Nie znaleziono")
Historia 1
W aplikacji bankowej była sekcja analizy statusów z kilkoma warunkami where. Z powodu pominięcia break i niewłaściwej kolejności case, pojawiały się sytuacje, gdzie nie był obsługiwany specyficzny przypadek, a użytkownicy nie widzieli pełnego statusu operacji. Błąd został wykryty dopiero podczas testów w terenie.
Historia 2
W systemie autoryzacji programista użył identycznych nazw zmiennych w różnych case’ach, co doprowadziło do zamieszania i błędu: w drugim przypadku próbowano użyć zmiennej zdefiniowanej w innym case. Kompilacja działała, ale nieprawidłowo w niektórych scenariuszach.
Historia 3
W złożonym dopasowywaniu wzorców z where nie uwzględniono, że default nie obsłuży części kombinacji powiązanego enum, co spowodowało, że aplikacja zakończyła działanie z błędem dopasowania wzorca. Problem został zauważony dopiero przy integracji nowych typów danych w przyszłości.