Давайте посмотрим что нового приготовил разработчикам 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). Рассмотрим же их.
- SE-0271 (Package Manager Resources) позволяет SPM содержать такие ресурсы, как изображения, аудио, JSON и многое другое.
- SE-0272 (Package Manager Binary Dependencies) позволяет SPM использовать бинарные пакеты наряду с существующей поддержкой исходных пакетов. Это означает, что общие SDK с закрытым исходным кодом, такие как Firebase, теперь могут быть интегрированы с помощью SPM.
- SE-0273 (Package Manager Conditional Target Dependencies) позволяет настроить целевые объекты так, чтобы они имели зависимости только для определенных платформ и конфигураций. Например, можно обозначить специальные дополнительные фреймворки при компиляции для Linux.
- SE-0278 позволяет добавлять локализованные ресурсы.
Таким образом, можно констатировать, что версия 5.3 привнесла несколько хороших нововведений, которые будут подхватываться со временем разработчиками.
ссылка на оригинал статьи https://habr.com/ru/post/503606/
Добавить комментарий