Swift jest bardzo rozbudowanym językiem programowania, który oddaje w ręce programistów wiele narzędzi do pracy z kodem. Jednym z nich jest Pattern matching, czyli możliwość porównywania wartości na podstawie określonego wzorca. Jest to chyba jedna z najczęściej pomijanych funkcji Swift’a, która może jednak znacznie poprawić czytelność naszego kodu.

Na podstawie przykładów pokażę Wam jak korzystać z pattern matching oraz kiedy może się ono przydać 🤓.

 

 

Zanim przejdziemy do omawiania szczegółów, zobaczmy jak wygląda najprostszy przykład wykorzystujący pattern matching do spółki z guard:

 

Funkcja checkTupleValue() jako jedyny argument przyjmuje obiekt, który określany jest jako Tuple. Składa się on z dwóch parametrów typu String. Wewnątrz funkcji znajduje się to co najistotniejsze – porównywanie wzorca z wykorzystaniem operatora case. W połączeniu z operatorem guard sprawdzamy, czy poszczególne wartości argumentu tuple pokrywają się z podanym wzorcem – („Foo”, „Bar”). Jeżeli wynik jest pozytywny to wyświetlamy odpowiednią informację w konsoli. W przeciwnym wypadku wyświetlamy informację o niepowodzeniu.

Innym przykładem zastosowania pattern matching, z którym się już zapewne nieświadomie zetknęliście (jeżeli pracowaliście już ze Swift’em) jest instrukcja switch, o której będzie za chwilę 👍.

 

Tuple jest prostą strukturą, która grupuje inne obiekty tworząc w ten sposób nowy typ danych. Bardzo przydatne, gdy chcemy na przykład zwrócić z funkcji więcej niż jeden parametr.

 

 

Wykorzystanie wzorców

 

 

Wzorców możemy używać w zestawieniu z wyrażeniami for, if, while, guard oraz switch. Zasada działania jest prosta – każda wartość posiada określoną strukturę (wzorzec), na podstawie której można dokonać porównania. Poniżej możecie zobaczyć jak pattern matching działa z wykorzystaniem poszczególnych wyrażeń. Przykład z guard był zaprezentowany na samym początku, więc tutaj go pominiemy. Podany kod najlepiej umieszczać w pliku Playground.

 

Switch

 

Switch pozwala nam na porównanie kilku wzorców w jednym miejscu:

 

Dzięki instrukcji switch możemy sprawdzić kilka wzorców w ramach jednego bloku. Z uwagi na swoją konstrukcję, daje nam on również gwarancję pokrycia wszystkich możliwych przypadków lub użycie domyślnej wartości tam gdzie jest to konieczne.

 

Instrukcja For

 

Konstrukcja z for jest bardzo prosta. Podajemy konkretną wartość, którą chcemy znaleźć:

 

Instrukcja If

 

Wykorzystanie instrukcji if jest podobne do switch, jednak bez wszystkich zalet tej drugiej. Ucierpi też znacznie czytelność naszego kodu:

 

 

Dostępne rodzaje wzorców

 

Powyżej mogliście zobaczyć proste przykłady zastosowania pattern matching, a teraz dowiecie się dokładnie z jakich wzorców będziecie mogli korzystać. Zaczniemy do dobrze wszystkim znanej enumeracji 😎.

 

Enumeration case pattern

 

W tym przypadku sprawdzana będzie wartość enumeracji:

 

Nic skomplikowanego. Jeżeli wartość enumeracji została ustawiona na .angular, to w konsoli wyświetli odpowiednią informację.

 

Value-binding pattern

 

Polega na użyciu słowa kluczowego var lub let podczas sprawdzania wzorca. Wartość zmiennej / stałej może zostać następnie użyta wewnątrz bloku kodu:

 

Możemy też powiązać kilka zmiennych / stałych jednocześnie umieszczając odpowiednie słowo kluczowe przed nawiasem:

 

 

Wildcard pattern

 

Wildcard pattern pozwala określić na jakich wartościach nie będzie nam zależało. W poniższym przykładzie dajemy do zrozumienia, że nie interesują nas informacje związane z programistą Angular:

 

 

Rzutowanie za pomocą „Is”

 

Za pomocą operatora is możemy sprawdzić, czy obiekt dziedziczy po danym typie:

 

Wzorzec ten możemy jednak trochę rozwinąć.

 

Warunkowe rzutowanie za pomocą „As”

 

Połączenie is oraz wzorca value-binding pattern (czyli standardowej kombinacji if-let). Dzięki jego zastosowaniu możemy uzyskać dostęp do wartości przechowywanej w rzutowanym obiekcie, o ile oczywiście takie rzutowanie będzie możliwe:

 

 

Optional pattern

 

Pozwala nam na odseparowanie wartości nil:

 

 

Słowo na drogę.

 

Jak sami widzicie pattern matching nie jest specjalnie skomplikowaną koncepcją i może w prosty sposób przyczynić się do poprawy czytelności naszego kodu. Skrywa on jeszcze kilka fajnych funkcji, ale te przedstawię już w osobny wpisie, bo ten zrobił się trochę przydługi 😜. Do usłyszenia 🧐.

 


 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *