Dopasowywanie wzorców w Swift pozwala w elegancki sposób wydobywać wartości i porównywać je z wzorcami w warunkach switch, pętlach oraz operatorach if case. Kluczową cechą jest możliwość nie tylko porównywania wartości, ale także wydobywania powiązanych danych ze złożonych struktur, takich jak wyliczenia z wartościami skojarzonymi, typami opcjonalnymi czy krotkami.
Operator case let jest często używany do wydobywania zagnieżdżonych wartości, na przykład:
enum Wynik { case sukces(wartość: Int) case błąd(błąd: Error) } let wynik: Wynik = .sukces(wartość: 42) switch wynik { case .sukces(let wartość): print("Sukces z wartością \(wartość)") case .błąd(let błąd): print("Błąd: \(błąd)") }
Dopasowywanie wzorców jest również wygodne przy pracy z kolekcjami:
let przedmioty: [Wynik] = [.sukces(wartość: 1), .błąd(błąd: MójBłąd()), .sukces(wartość: 42)] for case let .sukces(wartość) in przedmioty { print("Znaleziono wartość: \(wartość)") }
Ważne jest, aby pamiętać, że nie wszystkie wzorce będą działać, jeśli struktura lub enum są utworzone bez wartości skojarzonych lub bez odpowiedniego wsparcia z Equatable. Ponadto, niedoświadczeni programiści mogą popełnić błąd w exhaustiveness (pełności rozważenia wszystkich wariantów enum).
Jaka jest różnica między if let, guard let i if case let przy pracy z wartościami opcjonalnymi? W jakich przypadkach każdy z nich jest bardziej preferowany?
Odpowiedź:
if let i guard let są używane do bezpiecznego wydobywania wartości z typów opcjonalnych.if case let działa nie tylko na opcjonalach, ale także na enumach z wartościami skojarzonymi, rozszerzając możliwości dopasowywania wzorców.Przykład:
let liczba: Int? = 42 if case let wartość? = liczba { print("Wartość to \(wartość)") }
wartość? - wzorzec, który wydobywa wartość tylko wtedy, gdy nie jest nil.
Historia
Programista nie zaimplementował wszystkich przypadków dla enum w switch. Dodanie nowego przypadku w enum spowodowało cichą usterkę, ponieważ gałąź domyślna została dodana "dla bezpieczeństwa". W rezultacie część logiki przestała działać, a błąd objawił się tylko u użytkownika.
Historia
W projekcie używano tablicy
Wynik<T, Error>i próbowano filtrować tylko udane wartości przez zwykłą pętlęfor x in.... Prowadziło to do ręcznego sprawdzania typu, co powodowało pomijanie części sukcesów z powodu błędu w warunku.
Historia
Jeden z członków zespołu nie wiedział o
if case letz opcjonalami i zawsze robił podwójną kontrolę: najpierwif liczba != nil, a następnie przymusowe wydobycie przez "force unwrap". Prowadziło to do awarii na produkcji.