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.