Привет Хабр! Язык программирования Swift обладает большой популярностью ввиду его использования в написании приложений под iOS, поэтому его развитие представляет интерес для всех занятых в этой области.
Давайте посмотрим что нового приготовил разработчикам Swift версии 5.3.
Новая версия (SE-0279) предлагает новый синтаксис для конечных замыканий, который позволяет вызывать несколько замыканий в качестве параметров функции более читаемым способом. Это сводит к минимуму использование слишком большого количества скобок в сигнатуре функции.
На примере 2 вариантов вызова видно, что визуально второй смотрится несколько приятнее.
В настоящее время каждый пункт catch в операторе do-catch может содержать только один шаблон. Чтобы обойти эту проблему, разработчики будут использовать возможности вариантов коммутаторов для включения сопоставления шаблонов в тело операторов catch, тем самым увеличивая вложенный и дублированный код (SE-0276).
Catch-пункты теперь позволяют пользователю указывать разделенный запятыми список шаблонов с возможностью связывания переменных с телом catch — как в switch-е.
До сих пор сравнивать 2 элемента перечисления было не то что бы «приятным» делом. Надо было конформить Comparable и написать статическую функцию < для определения того, является ли исходное значение меньше другого.
Теперь Swift (SE-0266) позволяет не «париться» над реализацией всех этих вещей, и не нужно явно реализовывать протокол, пока у вашего перечисления есть одинаковые типы. Если соответствующие значения не заданы, перечисления будут сравниваться по семантическому порядку объявления.
Отныне можно опускать self в тех местах, где это больше не нужно (SE-0269). Ранее использование self в замыканиях было необходимо, когда мы захватывали значения из внешней области видимости.
Новая версия языка (SE-0267) ввела возможность присоединять where к функциям внутри универсальных типов и расширений.
В стек можно добавить новый метод sorted (), но только для тех случаев, когда элементы внутри стека конформят Comparable.
Введена Float16 плавающая точка половинной точности (SE-0277). С появлением машинного обучения на мобильных устройствах в последние годы это только указывает на амбиции Apple в продвижении данной темы. Float 16 обычно используется на мобильных графических процессорах для вычислений и в качестве сжатого формата для весов в приложениях, использующих ML.
Swift 5.3 ввел множество улучшений для Swift Package Manager (SPM). Рассмотрим же их.
Таким образом, можно констатировать, что версия 5.3 привнесла несколько хороших нововведений, которые будут подхватываться со временем разработчиками.
Давайте посмотрим что нового приготовил разработчикам 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 привнесла несколько хороших нововведений, которые будут подхватываться со временем разработчиками.