Nowości w języku programowania Swift 2.2

Słowem wstępu

Wersja Swift 2.2 zawiera kilka poprawek, kilka nowości a sporo metod oznaczonych zostało jako przestarzałe (deprecated). Jest to przygotowanie do wydania wersji 3, w której spodziewam się jeszcze większych zmian. Wersja Swift 2.2 jest załączona do Xcode 7.3 wydanego w pełnej wersji w lutym.
Zmiany idą w naprawdę dobrym kierunku i wraz z wersją 3 można spodziewać się w pełni dojrzałego języka programowania, który będzie mógł być wykorzystywany nie tylko do rozwoju aplikacji na iOS (patrz projekt http://perfect.org)
Zapraszam do lektury, punkty starałem napisać od najmniej istotnych do najważniejszych. Ostatni punkt dla programistów języków wywodzących się z C będzie szokiem.

 

Składnia Tuple splat oznaczona jako przestarzała

Tuple splat jest techniką przekazywania do metody mającej kilka parametrów, Tupla którego typy odpowiadają typom metody. Najłatwiej zobrazuje to przykład:

Konstrukcja rzadko używana i widywana, na szczęście jest oznaczona jako przestarzała. Została uznana za mało czytelną i łamiącą zasadę samo dokumentującego się kodu.

 

Sprawdzanie wersji Swift

W nowym wydaniu języka zostało wprowadzone sprawdzanie jego wersji. Powinno mieć ono zastosowanie tylko w bibliotekach, które udostępniamy dla świata. W naszym kodzie unikajmy dyrektyw preprocesora, ponieważ czynią one kod mniej czytelnym, łatwiejszym na popełnianie błędów.
Wersje języka sprawdzamy poniższą konstrukcją:

 

Słowa kluczowe jako argumenty metody

Starsze wersje Swift pozwalały używać słów kluczowych jako argumentów funkcji po ujęciu je w znaku pojedynczego cudzysłowu.

Aktualnie można używać słów kluczowych (oprócz inout, var i let) bez żadnych znaków. Dodatkowo otwierając projekt używający takiej konstrukcji w Xcode zostanie on automatycznie poprawiony przez Fix-it do poniższej postaci:

 

Porównywanie tupli

Ponieważ tuple są fundamentalnym typem w Swift, dziwne, że ta funkcjonalność dopiero teraz jest wprowadzona, ale lepiej późno niż wcale. W Swift 2.2 zostało wprowadzone porównywanie dwóch tupli. Porównanie polega na porównaniu każdego elementu jednego tupla do elementu drugiego tupla. Zwracana jest prawda, jeśli wszystkie elementy są takie same.

Dodatkową własnością porównywania jest to, że nieporównywane są nazwy elementów tylko ich wartości, czyli można porównać samochód do osoby i może wyjść, że są sobie równe.

Jedno ważne ostrzeżenie, porównywanie działa tylko do maksymalnie 6 elementów, powyżej tej wartości zwracany jest fałsz.

 

Parametry var są przestarzałe

Do wersji Swift 2.2 parametry metody mogliśmy oznaczać jako var jeśli chcieliśmy zmodyfikować je wewnątrz metody:

W nowej wersji języka należy ściśle zdefiniować, że chcemy zmieniać parametr i jawnie przesłać go przez referencje. Wprowadza to poprawę czytelności kodu, bez zastanawiania się, jaka będzie wartość parametru po wywołaniu metody.
Przesłanie przez referencję wygląda następująco i jak można się spodziewać wynik now jest 11, after również 11.

Takie zmiany jak powyższa tworzą Swift coraz lepszym językiem. Im mniej nieścisłości można utworzyć tym lepiej. Konstrukcja języka wymusza pisanie dobrego, jasnego kodu.

 

Zmiana wywoływania identyfikatorów trybu debug

Kompilator języka dostarcza nam dyrektywy kompilatora, czyli polecenia zawarte w kodzie źródłowym, które dla translatora są poleceniami wykonania pewnej czynności. W nowej wersji Swifta zostały one uproszczone i wywoływane są po znaku #.
W trybie debug można teraz uzyskać informacje o nazwie pliku, linii, kolumnie i nazwie metody gdzie uruchomiona jest dyrektywa.
Stare konstrukcje wyglądały następująco:

Natomiast teraz należy ich używać następująco:

O ile zmiana powyższych nie jest tak istotna, to dwa punkty dalej opiszę naprawdę bardzo ważną zmianę związana z dyrektywami i selektorami.

 

Dodanie do kolekcji metody removeFirst()

W Swift zawsze istniała operacja removeLast() na tablicach. Od teraz została dodana również metoda removeFirst() zwracająca i usuwająca pierwszy element tablicy.
Przykłady użycia metod na tablicach:

Jak można zauważyć, wywołanie metody na pustej tablicy spowoduje wygenerowanie błędu, także należy przed wywołaniem sprawdzić ilość elementów w tablicy.

 

Sprawdzanie nazw selektorów podczas kompilacji

To jest zmiana, która można nazwać genialną. Wywoływanie metod po nazwie przekazywanej w stringu jest kuriozalne, błędogenne i utrudniające refaktoring kodu.
Wywoływanie zostało zmienione z wywoływania nazwy w stringu na wywoływanie w dyrektywie preprocesora #selector().
Stary sposób wyglądał tak:

Według nowego podejścia należy wywołać następująco:

Jeśli popełnimy literówkę w nazwie metody wywoływanej, kompilator zgłosi nam to podczas kompilacji. W starym podejściu o błędzie dowiadywaliśmy się dopiero podczas uruchomienia błędnego kawałka kodu. W skrajnym przypadku błąd mógł objawić się u użytkownika po pobraniu z App Store.

 

Pętle znane z języka C oznaczone jako przestarzałe

Zmiana z pętlami wynika z kolejnego punktu, ale cierpliwości. Zmiana polega na oznaczeniu jako przestarzałe konstrukcji pętli for którą znamy z języków z rodziny C.
Konstrukcja wygląda następująco:

Aktualnie należy stosować prostszej składni, która wygląda następująco:

Jeśli potrzebujemy odliczać od 10 do 1, nie możemy użyć konstrukcji in 10…1 ponieważ spowoduje ona błąd, ale używamy poniższej konstrukcji:

Jeżeli chcemy odliczyć od jednego wzwyż ale co któryś element używamy poniższej konstrukcji:

Konstrukcje for in dla osób, które dopiero zaczynają się uczyć programować, mogą wydawać się bardziej sensowne i prostsze do zrozumienia, a dla starych programistów skrócą zapis.

 

Operatory ++ inkrementacji i  dekrementacji oznaczone jako przestarzałe.

Ta zmiana to prawdziwa bomba. Rozmawiałem z kilkoma programistami i każdy był bardzo zdziwiony, jak to możliwe, dlaczego, po co, świat się kończy!
Konstrukcje zwane i++ inkrementacją i i-– dekrementacją powodujące zwiększenie lub zmniejszenie wartości liczby i o jeden, zostały oznaczone jako przestarzałe i wraz z wersją Swift 3 zostaną usunięte.
Tak więc kod:

zastępujemy

Według autorów konstrukcja zwiększa trudność zrozumienia i nauki języka Swift, zapis i++ nie jest znacznie krótszy od zapisu i += 1, i dodatkowo może powodować trudności ze zrozumieniem bardziej zawiłych konstrukcji np foo(++a, a++).
No cóż, czasy się zmieniają, nowym programistom trudno zrozumieć konstrukcje inkrementacji. Trzeba przyznać jednak, że osoby zatwierdzające zmiany w języku Swift nie robią tylko zmian kosmetycznych, robią zmiany, które można nazwać rewolucją.

 

Podsumowując

Język Swift, który jest aktualnie rozwijany w modelu Open Source staje się w pełni dojrzałym, bardzo nowoczesnym językiem. Czerpie garściami z najlepszych wzorców i nie boi się zmian. Powyższe przykłady powodują, że programowanie aplikacji dla iOS i OS X staje się jeszcze przyjemniejsze niż dotychczas.

Wszystkie przykłady możecie uruchomić w trybie Playground, jeśli coś jest niejasne, pisz w komentarzu, spróbuję rozwinąć temat i dodać jakieś przykłady.

Michał