Dopasowanie wzorca to fundamentalna część języka Swift, umożliwiająca bezpieczne i eleganckie przetwarzanie różnych wariantów enum. To podejście pochodzi z języków funkcyjnych, gdzie dopasowanie wzorca pozwala kompaktowo przetwarzać różne przypadki, unikając długich ciągów if-else. W Swift dopasowanie wzorca dla enum realizuje się głównie za pomocą switch, gdzie każdy case jest przetwarzany oddzielnie.
Problem pojawia się, gdy nie są zaimplementowane wszystkie przypadki, lub wybrano default, który potencjalnie "ukrywa" nieprzewidziane przypadki. Może to prowadzić do błędów w czasie wykonywania przy dodawaniu nowych przypadków do enum.
Rozwiązanie — wyraźne przetwarzanie wszystkich wariantów enum w switch, unikając default (jeśli to możliwe). Takie podejście gwarantuje, że przy zmianie enum kompilator nie pominie nieprzetworzonych przypadków.
Przykład kodu:
enum NetworkStatus { case connected case disconnected case connecting } func handle(status: NetworkStatus) { switch status { case .connected: print("Sieć podłączona") case .disconnected: print("Sieć odłączona") case .connecting: print("Łączenie...") } }
Kluczowe cechy:
1. Czy dla enum bez wartości towarzyszących można używać wyrażeń if case?
Tak, można. Umożliwia to zwięzłe sprawdzanie konkretnego case.
if case .connected = status { print("Sieć podłączona") }
2. Czy konieczne jest implementowanie default, jeśli w switch używane są wszystkie case?
Nie, jeśli zaimplementowane są wszystkie warianty, default nie jest wymagany. Lepiej unikać default — w ten sposób kompilator sygnalizuje dodanie nowych case.
3. Czy można używać fallthrough w obrębie switch z enum?
Tak, jest to możliwe, ale zdecydowanie niewskazane, ponieważ fallthrough nie uwzględnia semantyki case i może prowadzić do błędów logicznych.
W enum NetworkStatus dodano nowy case .noSignal, ale w istniejącym switch znajduje się default, dlatego błąd wykrywany jest dopiero w czasie działania, gdy status nie jest przetwarzany poprawnie.
Zalety:
Wady:
Wszystkie case są przetwarzane wyraźnie. Kompilator informuje o konieczności dostosowania switch natychmiast po dodaniu nowego case.
Zalety:
Wady: