
Domyślne wartości dla niestandardowych indeksów
Od wersji Swift 5.2 własne funkcje indeksów mogą teraz w prosty sposób ustawić wartość domyślną, czyli taką, która zostanie zwrócona, jeśli nie zostanie odnaleziony indeks. Na przykład, jeśli mamy strukturę Team, a w niej listę nazwisk zawodników (players), możemy przekazać wartość domyślną, jeśli ktoś próbuje uzyskać dostęp do indeksu poza granicami listy.
struct Team {
var players: [String]
subscript(index: Int, default default: String = "Zawodnik nieznany") -> String {
if index >= 0 && index < players.count {
return players[index]
} else {
return `default`
}
}
}
let orzelWisla = Team(players: ["Adam Małysz", "Jan Kurpiel", "Zenon Krótkolot"])
print(orzelWisla[0])
print(orzelWisla[5])
Ten kod spowoduje wydrukowanie napisu „Adam Małysz”, ponieważ ma indeks równy 0, oraz napisu „Zawodnik nieznany”, ponieważ nie ma zawodnika o indeksie 5, natomiast domyślną wartość ustawiliśmy „Zawodnik nieznany”.
print(orzelWisla[-1, default: "Nieoczekiwany błąd
pobierania danych zawodnika"])
Możemy też nadpisać domyślną wartość przez przekazanie jej jako parametru jak na powyższym przykładzie. W tym wypadku, jako że indeks ujemny jest poza dozwolonymi granicami listy, nie wypisze nam się tu napis „Zawodnik nieznany”, lecz napis „Nieoczekiwany bład pobierania danych zawodnika”.
Niekompatybilne zmiany
W wersji 5.2 wprowadzono dwie zmiany, która są niekompatybilne z poprzednią wersją Swifta.
Pierwsza zmiana – podklasa nie może już automatycznie dziedziczyć inicjatorów z ich nadklasy, jeśli ta nadklasa jest zdefiniowana w innych modułach i ma przydzielony niepubliczny inicjator.
Aby przywrócić dotychczasowe zachowanie, czyli automatyczne dziedziczenie, klasa podstawowa musi zapewnić, że wszystkie inicjatory są typu public lub open.
Drugą zmianą, która może zepsuć dotychczasowy kod, ujawnia się przy okazji używania tzw. leniwego filtrowania (lazy filtering). Jeśli używasz funkcji lazy, przy filtrowaniu wielokrotnym od wersji 5.2 filtry będą uruchamiane w odwrotnej kolejności.
Załóżmy, że mamy tablicę imion i stosujemy pierwszy filtr, aby wybrać imiona na literę „M”, a następnie drugi dowolny filtr.
let names = ["Marta", "Magdalena", "Helena", "Aleksander", "Piotr"]
.lazy
.filter { print("filter 1 item: \($0)");
return $0.hasPrefix("M") }
.filter { print("filter 2 item: \($0)"); return true }
_ = names.count
Powyższy kod dla Swift 5.2 i wyższego da wynik, taki sam, jak byśmy usunęli funkcję lazy.
filter 1 item: Marta
filter 2 item: Marta
filter 1 item: Magdalena
filter 2 item: Magdalena
filter 1 item: Helena
filter 1 item: Aleksander
filter 1 item: Piotr
W poprzednich wersjach języka Swift drugi filtr uruchamiany był przed pierwszym, więc w konsoli znalazłyby się dodatkowe wypisy filtru drugiego dla imion nie zaczynających się od litery M.
Nowa ulepszona diagnostyka
Swift 5.2 dołożył kolejną cegiełkę do rozkoszowania się bogatymi możliwościami języka. Wprowadzony został nowy silnik diagnostyczny dla błędów kompilatora, dodano również kilka nowych funkcji do testowania i debugowania.
Więcej informacji znajdziesz w oficjalnym dokumencie opisującym zmiany https://swift.org/blog/swift-5-2-released/

Odkąd się zorientował, że istnieje, jest programistą. Programuje, planuje, organizuje, optymalizuje i wdraża. Przeszedł drogę od juniora, przez seniora, team leadera do architekta rozwiązań mobilnych. Współtworzył i nadal tworzy aplikacje mobilne dla największych polskich banków.