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). Рассмотрим же их.
- 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 привнесла несколько хороших нововведений, которые будут подхватываться со временем разработчиками.