Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save MihaelIsaev/d618deb7401ae06bccd710ef1472b38c to your computer and use it in GitHub Desktop.
Save MihaelIsaev/d618deb7401ae06bccd710ef1472b38c to your computer and use it in GitHub Desktop.

What's new in Swift 6 (Swiftify article translated into Russian)

Что нового в Swift 6 (перевод статьи Swiftify)

Apple планирует выпустить Swift 6 в сентябре 2024 года наряду с Xcode 16. Это будет первое крупное обновление Swift за последние пять лет, начиная с Swift 5. Этот выпуск приурочен к 10-летнему юбилею Swift. За эти годы Swift значительно развился, от простого улучшения Objective-C до безопасного, многофункционального и производительного языка, который легко использовать.

Apple ранее упоминала, что будут последовательно выпускаться версии Swift 5.x, вводящие инкрементальные изменения и новые функции для подготовки к Swift 6. Основные цели включали улучшение поддержки параллелизма и модели владения памятью. На данный момент они были достигнуты в значительной степени.

Давайте кратко вспомним эволюцию версий Swift 5.x за годы.

Swift 5.1 (сентябрь 2019 года) добавил opaque return types (основная функция для SwiftUI), неявные возвраты и стабильность формата модуля.

Swift 5.2 (март 2020 года) принес функции, такие как key path expressions в качестве функций и улучшенная диагностика.

Swift 5.3 (сентябрь 2020 года) внес различные улучшения языка, такие как множественное перехватывание ошибок, множественные завершающие замыкания (что привело к значительным улучшениям в API SwiftUI) и улучшения Swift Package Manager.

Swift 5.4 (апрель 2021 года) добавил поддержку нескольких вариативных параметров в функциях и result-билдеры.

Swift 5.5 (сентябрь 2021 года) был огромным обновлением, внесшим функции, сосредоточенные на параллелизме, такие как async/await, async sequences, структурированный параллелизм, акторы, глобальные акторы и Sendable протоколы/замыкания. Он также позволяет долгожданное взаимозаменяемое использование типов CGFloat и Double. Это обновление заложило основу для других связанных с параллелизмом обновлений в последующих версиях.

Swift 5.6 (март 2022 года) дальше улучшил параллелизм и языковые усовершенствования, такие как type placeholders и existential Any. Также были добавлены плагины для Swift Package Manager.

Swift 5.7 (сентябрь 2022 года) представил краткий синтаксис для разворачивания опционалов, Swift Regex, улучшил совместимость с API на C, улучшения параллелизма, а также функции меньшей и быстрой стандартной библиотеки.

Swift 5.8 (март 2023 года) смягчил ограничения на переменные в result-билдерах, улучшил неявный self и позволил обратное развертывание функций.

Swift 5.9 (сентябрь 2023 года) улучшил дженерики с помощью паков значений и типов (что устраняет ограничение на использование 10 типов в result-билдерах SwiftUI), добавил макросы, улучшил управление потоком с помощью выражений if и switch, а также добавил возможность отбрасывать группы задач.

Swift 5.10 (март 2024 года) закрывает все известные статические уязвимости в обработке данных для полной строгой проверки параллелизма. Он вводит строгий параллелизм для глобальных переменных, который предотвращает гонки данных при использовании глобальных и статических переменных. Также внедряются изолированные выражения значений по умолчанию, что закрывает уязвимость в безопасности данных, которая ранее позволяла изолированным значениям свойств по умолчанию синхронно вычисляться извне актора.

Swift 6 будет строиться на этой базе. Давайте рассмотрим его наиболее заметные особенности.

Макрос выражения как аргумент на стороне вызова

Пользовательские макросы теперь могут использоваться в качестве аргумента по умолчанию, как встроенные макросы. Когда пользовательские макросы используются в качестве аргументов по умолчанию, они расширяются на месте вызова; в то время как, когда они используются как подвыражения аргументов по умолчанию, они расширяются в том месте, где они написаны. Например, рассмотрим следующие функции, использующие макрос #MyFileID.

@freestanding(expression)
macro MyFileID<T: ExpressibleByStringLiteral>() -> T = ...

public func callSiteFile(_ file: String = #MyFileID) { file }

public func declarationSiteFile(_ file: String = (#MyFileID)) { file }

public func alsoDeclarationSiteFile(
    file: String = callSiteFile(#MyFileID)
) { file }

Вот как макрос расширяется при вызове из кода приложения.

print(callSiteFile())            // print main.swift, the current file
print(declarationSiteFile())     // always prints MyLibrary.swift
print(alsoDeclarationSiteFile()) // always prints MyLibrary.swift

Итерация паков

Swift 5.9 ввел параметры значений и типа, что позволило писать обобщенные функции, принимающие произвольное количество аргументов с различными типами. Наиболее заметным эффектом было удаление ограничения в 10 типах в SwiftUI. С Swift 6 мы теперь можем выполнять итерацию паков значений с помощью циклов for-in. Это продвинутая функция Swift, и она может значительно повлиять на API SwiftUI.

func == <each Element: Equatable>(lhs: (repeat each Element), rhs: (repeat each Element)) -> Bool {
  for (left, right) in repeat (each lhs, each rhs) {
    guard left == right else { return false }
  }
  
  return true
}

Кортежи соответствуют протоколам Equatable, Comparable и Hashable

Поскольку кортежи лишены возможности соответствовать протоколам, многие разработчики перестали использовать кортежи вообще в пользу структур, которые могут соответствовать протоколам. Кортежи теперь соответствуют протоколам Equatable, Comparable и Hashable, если их элементы соответствуют этим протоколам.

// Equatable
(1, 2, 3) == (1, 2, 3) // true
// Labels are not taken into account to check for equality.
(x: 0, y: 0) == (0, 0) // true

// Comparable
let origin = (x: 0, y: 0)
let randomPoint = (x: Int.random(in: 1 ... 10), y: Int.random(in: 1 ... 10))
(x: 0, y: 0) < (1, 0) // true
// Labels are not taken into account for comparision.
(x: 0, y: 0) < (1, 0) // true

// Hashable
let points = [(x: 0, y: 0), (x: 1, y: 2), (x: 0, y: 0)]
let uniquePoints = Set(points)
print (uniquePoints) // [(x: 0, y: 0), (x: 1, y: 2)]
// Labels are not taken into account to check for hash value.
(x: 0, y: 0).hashValue == (0, 0).hashValue // true

Типизированные исключения

Ошибки в Swift всегда типизированы до any Error, что способствует написанию обобщенного кода обработки ошибок. После внедрения SE-413 функции и замыкания могут выбрасывать конкретные типы ошибок.

Заключение

Выпуск Swift 6 является важным этапом для преобразования ваших приложений Objective-C в Swift, если вы этого еще не сделали. Переход на Swift позволяет использовать совершенно новые фреймворки, такие как SwiftUI, SwiftData, RegexBuilder, Algorithms и т. д., что делает разработку приложений быстрее и проще.

Согласно опросу "Состояние экосистемы разработчиков 2023 года" от JetBrains, "Objective-C объективно устарел". Objective-C потерял две трети своих пользователей за последние шесть лет, и в прошлом году его использовали всего 2% респондентов в 2023 году. Также, согласно этому исследованию об использовании Swift и SwiftUI в бинарных файлах Apple, использование SwiftUI выросло на 70%, а использование Swift выросло на 50% с iOS 16 по iOS 17.

Ясно, что сообщество разработчиков Objective-C уменьшается, и Apple постепенно склоняется к Swift в своих внутренних бинарных файлах; поэтому имеет смысл начать миграцию на Swift. Миграция на Swift также позволяет использовать SwiftUI и позволяет вашим приложениям охватывать все платформы Apple.

Использованная литература

Статья Swiftify

Использование Apple Swift и SwiftUI в iOS 17

Путь к Swift 6

SE-0283: Кортежи соответствуют протоколам Equatable, Comparable и Hashable

SE-0422: Макрос выражения в качестве аргумента по умолчанию на стороне вызывающего

SE-0408: Итерация паков

SE-0413: Типизированные исключения

Изменения в Swift

Состояние экосистемы разработчиков 2023

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment