
Prace nad nową wersją Swift 5.3 przybierają na tempie. Już nie długo planowane jest oficjalne wydanie.
Swift 5.3 przynosi kolejną serię ulepszeń dla Swift, w tym kilka nowych, potężnych funkcji, takich jak Multi-pattern catch clauses (SE-0276) czy multiple trailing closures (SE-0279).
W tym artykule omówię tylko część zmian wraz praktycznymi przykładami kodu, abyś mógł samodzielnie przećwiczyć. Zachęcam też do przeczytania moich wcześniejszych artykułów dotyczących Swift 5.2, jeśli przegapiłeś je do tej pory.
W dotychczasowych wersjach Swift’a każda klauzula catch w instrukcji do-catch może zawierać tylko jeden wzorzec i klauzulę where.
SE-0276 wprowadził możliwość przechwytywania wielu przypadków błędów w jednym bloku catch, co pozwala nam usunąć powielanie tego samego kodu w obsłudze błędów.
Dotychczasowy kod:
do {
try performTask()
} catch let error as TaskError {
switch error {
case TaskError.someRecoverableError:
recover()
case TaskError.someFailure(let msg),
TaskError.anotherFailure(let msg):
showMessage(msg)
}
}
będzie można przekształcić do prostszej postaci:
do {
try performTask()
} catch TaskError.someRecoverableError { // OK
recover()
} catch TaskError.someFailure(let msg),
TaskError.anotherFailure(let msg) { // Also Allowed
showMessage(msg)
}
SE-0279 wprowadza możliwość definiowania wielokrotnych domknięć, co ułatwnia wywoływanie funkcji, jak na przykładzie:
UIView.animate(withDuration: 0.3, animations: {
self.view.alpha = 0
}, completion: { _ in
self.view.removeFromSuperview()
})
Do tej pory mogliśmy użyć jednego domknięcia, więc kod sprowadzał się to takiej postaci:
UIView.animate(withDuration: 0.3, animations: {
self.view.alpha = 0
}) { _ in
self.view.removeFromSuperview()
}
Dzięki wprowadzeniu zmiany umożliwiającej wielokrotne użycie składni domknięcia, od wersji Swift 5.3 będzie możliwy taki zapis:
UIView.animate(withDuration: 0.3) {
self.view.alpha = 0
} completion: { _ in
self.view.removeFromSuperview()
}
Kolejna zmiana dotyczy typu wyliczeniowego. Do tej pory tworząc różnego rodzaju zmienne typu wyliczeniowego trzeba samodzielnie zdefiniować protokół Comparable. Zmiana SE-0266 wprowadza domyślną implementację tego protokołu dla typu wyliczeniowego zarówno dla wartości zwykłych jak i powiązanych. Porządek porównania jest oparty na porządku deklaracji przypadków wyliczeniowych, a następnie leksykograficznym porządku porównania powiązanych wartości dla przypadków wartości z powiązaniem.
enum Membership: Comparable {
case premium(Int)
case preferred
case general
}
([.preferred, .premium(1), .general, .premium(0)] as [Membership]).sorted()
// [Membership.premium(0), Membership.premium(1), Membership.preferred, Membership.general]
Możemy używać Range <Index>, aby odnieść się do grupy kolejnych pozycji w kolekcji, ale obecnie standardowo nie mamy sposobu na odniesienie do nieciągłych zbiorów pozycji w dowolnej kolekcji. SE-0270 wprowadza nowy typ RangeSet, który może reprezentować dowolną liczbę pozycji, wraz z algorytmami algebraicznymi do operowania na zbiorach, jak łączenie zbiorów, wyznaczanie wspólnej części itd.
aSE-0277 wprowadza nowy, półprecyzyjny typ zmiennoprzecinkowy o nazwie Float16, który jest powszechnie stosowany w programowaniu graficznym i uczeniu maszynowym.
SE-0268 dostosowuje sposób działania obserwatorów właściwości didSet, aby były bardziej wydajne. Nie wymaga to zmiany kodu, chyba że w jakiś sposób polegałeś na poprzednim błędnym zachowaniu. Zmiana daje tylko niewielką poprawę wydajności za darmo.
Nie są to wszystkie zmiany, które pojawią się w wersji 5.3. Kolejne opiszę w kolejnym artykule, na który już teraz Cię zapraszam.
Wersja Swift 5.3 ma być dostępna w nowej wersji Xcode’a, który prawdopobnie zostanie zaprezentowany wkrótce na konferencji WWDC20. Przypomnę, że tegoroczny WWDC, po raz pierwszy będzie w całości transmitowany online.

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.