
Swift 6.2: Расширяем границы производительности и безопасности
Мы рады представить выпуск Swift 6.2! Это обновление призвано повысить производительность каждого разработчика, независимо от того, над каким проектом он работает. От улучшенных инструментов и библиотек до серьёзных продвижений в параллелизме и производительности — Swift 6.2 предлагает богатый набор функций для реальных задач на всех уровнях программного стека.
В этой статье мы расскажем о ключевых изменениях в языке, библиотеках, инструментах и поддержке платформ, а также о том, как начать работу с новой версией.
Доступный параллелизм
Swift 6.2 делает параллельное программирование более интуитивным, сокращая количество шаблонного кода и предлагая более естественные способы написания безопасного параллельного кода.
Изоляция главного актора по умолчанию: Теперь ваш код может автоматически запускаться в главном потоке без явных аннотаций. Эта опция идеально подходит для сценариев, связанных с пользовательским интерфейсом.
Интуитивные асинхронные функции: Раньше асинхронные методы, не привязанные к актору, всегда выполнялись в глобальном пуле потоков, что могло приводить к ошибкам. В Swift 6.2 такие функции выполняются в контексте вызывающей стороны, даже если вызов идёт от главного актора.
Контроль над параллелизмом с
@concurrent: Новый атрибут@concurrentпозволяет чётко обозначить код, который может выполняться параллельно. Это помогает разделить задачи, которые должны оставаться последовательными, и те, что можно распараллелить.
Пример:
// В режиме "главный модуль изоляции по умолчанию"
struct ImageLoader {
// Кэш защищён главным актором.
static var cachedImage: [URL: Image] = [:]
static func create(from url: URL) async throws -> Image {
if let image = cachedImage[url] {
return image
}
let image = try await fetchImage(from: url)
cachedImage[url] = image
return image
}
// Загрузка и декодирование больших изображений в параллельном пуле.
@concurrent
static func fetchImage(from url: URL) async throws -> Image {
let (data, _) = try await URLSession.shared.data(from: url)
return await decode(data: data)
}
}
В совокупности эти улучшения помогают писать код без гонки данных с меньшим количеством аннотаций, делают поведение асинхронного кода более предсказуемым и позволяют точечно внедрять параллелизм там, где это необходимо.
Программирование безопасных систем
Swift 6.2 включает функции, предназначенные для повышения производительности без ущерба для безопасности. Они помогают писать безопасный низкоуровневый код с предсказуемой производительностью.
-
InlineArray: Это новый массив фиксированного размера со встроенным хранилищем, который может размещаться в стеке, избегая дополнительных выделений в куче.struct Game { // Сокращённая запись для InlineArray<40, Sprite> var bricks: [40 Sprite] init(brickSprite: Sprite) { bricks = .init(repeating: brickSprite) } } -
Span: Новый типSpanпредоставляет безопасный прямой доступ к непрерывным областям памяти. Гарантии безопасности памяти достигаются на этапе компиляции без расходов времени на выполнение.Swift 6.2 расширяет свои возможности для низкоуровневой разработки и проектов с повышенными требованиями к безопасности, предлагая не только новые API, но и фундаментальные улучшения.
Embedded Swift теперь включает:
Полнофункциональные строковые API Swift
Типы
anyдля протоколов с ограничением классаНовые типы
InlineArrayиSpan
Безопасная интероперабельность с C++: Проекты, сочетающие Swift и C++, могут использовать безопасные абстракции Swift (такие как
Span) для C++ API через аннотации заголовков.Строгая защита памяти (опционально): Swift обеспечивает безопасность памяти с момента создания, но позволяет использовать небезопасные конструкции (например,
UnsafePointer) при работе с C API. В Swift 6.2 появилась опциональная строгая защита памяти, которая помечает использование небезопасных конструкций. Это позволяет либо заменить их безопасными аналогами, либо явно подтвердить их необходимость в исходном коде. Эта функция опциональна, поскольку большинству проектов не требуется такой уровень контроля — она предназначена для проектов с самыми строгими требованиями к безопасности.Оптимизированные рабочие процессы
Помимо улучшений языка, Swift 6.2 делает повседневный цикл написания, сборки и отладки кода более плавным и эффективным.
Расширение Swift для VS Code
Расширение Swift для VS Code теперь официально проверено и распространяется через Swift.org. Последняя версия включает:
Фоновая индексация по умолчанию: Работайте с быстрыми и всегда актуальными функциями редактора, такими как переход к определению и автодополнение кода.
Встроенная отладка LLDB: Выполняйте код пошагово, устанавливайте точки останова и проверяйте состояние переменных прямо в VS Code.
Панель проекта Swift: Управляйте целями, зависимостями и задачами вашего Swift-проекта в режиме проводника.
Прямой просмотр DocC: Просматривайте готовую документацию бок о бок с кодом; она обновляется в реальном времени по мере редактирования.
Эти улучшения предоставляют первоклассный инструментарий для работы над Swift-проектами в выбранной среде.
Точный контроль предупреждений
Swift 6.2 позволяет гибко управлять предупреждениями компилятора на уровне диагностических групп. Вы можете указать желаемое поведение для определённых категорий предупреждений прямо в манифесте пакета.
.target( name: "MyLibrary", swiftSettings: [ .treatAllWarnings(as: .error), // Все предупреждения считаются ошибками .treatWarning("DeprecatedDeclaration", as: .warning), // Кроме устаревших API ] )Производительность сборки макросов
Swift 6.2 значительно сокращает время чистой сборки для проектов, использующих макросы. Раньше системе сборки приходилось компилировать пакет
swift-syntaxиз исходного кода, что заметно увеличивало время компиляции. Теперь SwiftPM поддерживает предварительно собранные зависимостиswift-syntax, полностью исключая этот затратный этап.Улучшенная асинхронная отладка
Отладка параллельного кода в LLDB стала значительно проще:
Надёжный асинхронный переход: Переходите в асинхронные функции, даже если вызов требует переключения потоков.
Контекст задачи: Видите, в какой задаче выполняется код при остановке на точке останова, и просматривайте backtrace для текущего потока.
Именованные задачи: Присваивайте задачам понятные имена, которые отображаются в контексте отладки и профилирования.
Миграция на новые функции
Swift 6.2 включает инструменты для плавного перехода на будущие версии языка:
Выявление несовместимостей: Инструментарий предупреждает о шаблонах кода, которые перестанут компилироваться или изменят поведение.
Автоматизация изменений: Применяйте готовые исправления для обновления кода с сохранением текущей логики.
Это избавляет от рутины ручного внесения изменений. Подробнее об инструментах миграции можно узнать в руководстве по миграции Swift.
Обновления стандартных библиотек
Библиотеки Swift 6.2 продолжают развиваться, помогая писать более чистый и безопасный код в различных сценариях.
Subprocess
Новый пакет
Subprocessпредлагает современный и удобный для параллелизма API для запуска и управления внешними процессами — идеально для автоматизации, скриптов и серверных задач.import Subprocess let swiftPath = FilePath("/usr/bin/swift") let result = try await Subprocess( .path(swiftPath), arguments: ["--version"] ) let swiftVersion = result.stdoutИзучите полный API версии 0.1 в репозитории swift-subprocess. Ваши отзывы помогут сформировать финальный API версии 1.0.
Foundation
В Swift 6.2
NotificationCenterполучает современный API, использующий строго типизированные уведомления вместо строк и нетипизированных словарей. Теперь вы можете определить структуру уведомления со свойствами, а наблюдатели будут использовать конкретный тип, избегая ошибок приведения типов. Типы уведомлений также определяют, публикуются ли они синхронно на главном акторе или асинхронно, через соответствие протоколамMainActorMessageилиAsyncMessage, что исключает ошибки параллелизма.Observation
Swift 6.2 позволяет отслеживать изменения состояния наблюдаемых типов с помощью нового типа асинхронной последовательности
Observations. Обновления включают все синхронные изменения свойств, а транзакция завершается при следующей точке приостановки (await). Это предотвращает избыточные обновления UI, повышает производительность и гарантирует, что ваш код реагирует на согласованный снимок состояния.Swift Testing
В Swift Testing добавлены новые API для большей выразительности тестов и их результатов:
Тестирование завершения (
Exit testing): Позволяет проверить, что код корректно завершает работу при определённых условиях (например, при сбое предусловия). Такие тесты запускаются в отдельном процессе.Вложения (
Attachments): Позволяют добавлять в результаты тестов дополнительный контекст: строки, изображения, логи и другие артефакты, которые упрощают диагностику сбоев.Отображаемые имена через raw identifiers: Позволяют настраивать названия тестовых функций с меньшим количеством кода.
// Было: // @Test("square() returns x * x") // func squareIsXTimesX() { // Стало: @Test func `square() returns x * x`() { #expect(square(4) == 4 * 4) }Поддержка WebAssembly
Swift 6.2 добавляет поддержку WebAssembly (Wasm) — платформы виртуальных машин, ориентированной на переносимость, безопасность и высокую производительность. Теперь вы можете собирать клиентские и серверные приложения для Wasm и запускать их в браузере или других средах выполнения. Подробнее о видении поддержки Wasm в Swift читайте в соответствующем разделе на Swift.org.
Благодарности
Спасибо всем, кто делился своим опытом, трудностями и идеями, которые сформировали Swift 6.2. Ваши отзывы помогли определить, где язык может стать дружелюбнее, где безопасность должна ощущаться естественнее, а инструменты — повышать продуктивность. Улучшения в Swift 6.2 стали возможны благодаря вашему участию.
Если вам небезразлично будущее Swift — сейчас лучшее время, чтобы присоединиться к сообществу. Участвуйте в Swift Evolution, вносите код на GitHub или делитесь впечатлениями о языке в реальных проектах. Каждое мнение помогает формировать будущее Swift. Наше сообщество ценит сотрудничество и радо новым горизонтам. Присоединяйтесь, учитесь у других и помогите сделать Swift еще лучше.
С полным списком принятых предложений (SE) можно ознакомиться на дашборде Swift Evolution.
Чтобы обновиться, установите последнюю версию инструментов с помощью Swiftly (
swiftly install 6.2) или на Swift.org/install и начните изучать Swift 6.2 уже сегодня!