Swift 5.3: Что нового?

от автора

Привет Хабр! Язык программирования Swift обладает большой популярностью ввиду его использования в написании приложений под iOS, поэтому его развитие представляет интерес для всех занятых в этой области.

Давайте посмотрим что нового приготовил разработчикам Swift версии 5.3.

Multiple trailing closures

Новая версия (SE-0279) предлагает новый синтаксис для конечных замыканий, который позволяет вызывать несколько замыканий в качестве параметров функции более читаемым способом. Это сводит к минимуму использование слишком большого количества скобок в сигнатуре функции.

import Foundation  func load(url: String, success: (Data) -> Void, failure: (Error) -> Void) {      }  // old  version  load(url: "someURL", success: { data in }, failure: { error in })  // new multiple trailing closures  load(url: "someURL") { (data) in     // do smth } failure: { (error) in     // do smth }

На примере 2 вариантов вызова видно, что визуально второй смотрится несколько приятнее.

Multi-Pattern Catch Clauses

В настоящее время каждый пункт catch в операторе do-catch может содержать только один шаблон. Чтобы обойти эту проблему, разработчики будут использовать возможности вариантов коммутаторов для включения сопоставления шаблонов в тело операторов catch, тем самым увеличивая вложенный и дублированный код (SE-0276).

Catch-пункты теперь позволяют пользователю указывать разделенный запятыми список шаблонов с возможностью связывания переменных с телом catch — как в switch-е.

enum NetworkError: Error {     case failure, timeout }  // old  version func networkCall(){   do{     try someNetworkCall()   } catch NetworkError.timeout{     print("timeout")   } catch NetworkError.failure{     print("failure")   } }  // new multi-Pattern catch clauses func networkCall(){   do{     try someNetworkCall()   } catch NetworkError.failure, NetworkError.timeout {     print("handle for both")   } }

Synthesized Comparable Conformance for Enums

До сих пор сравнивать 2 элемента перечисления было не то что бы «приятным» делом. Надо было конформить Comparable и написать статическую функцию < для определения того, является ли исходное значение меньше другого.

Теперь Swift (SE-0266) позволяет не «париться» над реализацией всех этих вещей, и не нужно явно реализовывать протокол, пока у вашего перечисления есть одинаковые типы. Если соответствующие значения не заданы, перечисления будут сравниваться по семантическому порядку объявления.

enum Brightness: Comparable {     case low(Int)     case medium     case high }  ([.high, .low(1), .medium, .low(0)] as [Brightness]).sorted() // [Brightness.low(0), Brightness.low(1), Brightness.medium, Brightness.high]

количество self-ов можно будет сократить

Отныне можно опускать self в тех местах, где это больше не нужно (SE-0269). Ранее использование self в замыканиях было необходимо, когда мы захватывали значения из внешней области видимости.

struct OldView: View {      var body: some View {         Button(action: {             self.sayHello()         }) {             Text("Press")         }     }          func sayHello() {} }  struct NewView: View {      var body: some View {         Button {             sayHello()         } label: {             Text("Press")         }     }          func sayHello(){} }

Where в generic-ах

Новая версия языка (SE-0267) ввела возможность присоединять where к функциям внутри универсальных типов и расширений.

struct Stack<Element> {     private var array = [Element]()      mutating func push(_ obj: Element) {         array.append(obj)     }      mutating func pop(_ obj: Element) -> Element? {         array.popLast()     } }  extension Stack {     func sorted() -> [Element] where Element: Comparable {         array.sorted()     } }

В стек можно добавить новый метод sorted (), но только для тех случаев, когда элементы внутри стека конформят Comparable.

Новый тип Float16

Введена Float16 плавающая точка половинной точности (SE-0277). С появлением машинного обучения на мобильных устройствах в последние годы это только указывает на амбиции Apple в продвижении данной темы. Float 16 обычно используется на мобильных графических процессорах для вычислений и в качестве сжатого формата для весов в приложениях, использующих ML.

let f16: Float16 = 7.29

Swift 5.3 ввел множество улучшений для Swift Package Manager (SPM). Рассмотрим же их.

  1. SE-0271 (Package Manager Resources) позволяет SPM содержать такие ресурсы, как изображения, аудио, JSON и многое другое.
  2. SE-0272 (Package Manager Binary Dependencies) позволяет SPM использовать бинарные пакеты наряду с существующей поддержкой исходных пакетов. Это означает, что общие SDK с закрытым исходным кодом, такие как Firebase, теперь могут быть интегрированы с помощью SPM.
  3. SE-0273 (Package Manager Conditional Target Dependencies) позволяет настроить целевые объекты так, чтобы они имели зависимости только для определенных платформ и конфигураций. Например, можно обозначить специальные дополнительные фреймворки при компиляции для Linux.
  4. SE-0278 позволяет добавлять локализованные ресурсы.

Таким образом, можно констатировать, что версия 5.3 привнесла несколько хороших нововведений, которые будут подхватываться со временем разработчиками.

ссылка на оригинал статьи https://habr.com/ru/post/503606/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *