[Перевод] Swift 6.4

Swift 6.4 теперь доступна. Swift стремится быть отличным выбором для всего стека — от приложений и серверов до системного кода, встраиваемых устройств и браузера. Этот выпуск углубляет эту поддержку и делает повседневный код проще для написания. Основные моменты:
Swift Build теперь используется по умолчанию в Swift Package Manager, поэтому ваши проекты собираются одинаково в Linux, macOS и Windows.
Subprocess достигает версии 1.0 — это стабильный кроссплатформенный способ запуска других программ из Swift и взаимодействия с ними: от инструментов командной строки до потоковых процессов.
Интероперабельность расширяется:
Spanв Swift теперь напрямую связывается сstd::spanиз C++20, а Swift/Java-интероперабельность расширяет поддержку async и обратных вызовов.Swift работает быстрее в браузере: мост WebAssembly через JavaScriptKit стал до 40 раз быстрее, а Wasm SDK теперь доступен напрямую с Swift.org.
Embedded Swift становится более функциональным: добавлена поддержка экзистенциальных типов и более богатая обработка ошибок для целей класса микроконтроллеров.
Производительность улучшается при сохранении безопасности памяти: появились новые типы массивов, которые хранят некопируемые элементы без накладных расходов copy-on-write, а также новый протокол
Iterableдля итерации без копирования.
Это далеко не всё. Читайте далее подробное руководство по новым изменениям или ознакомьтесь с панелью Swift Evolution, чтобы увидеть полный список предложений в Swift 6.4.
Более простой и понятный код
Swift 6.4 упрощает повседневное программирование, делая ваш код проще и понятнее.
Более естественные опциональные типы
someиany. При написании опционального типаsomeилиanyбольше не нужно заключать тип в скобки. Вместо(some Rocket)?можно просто написатьsome Rocket?(SE-0521).Управление предупреждениями компилятора на уровне исходного кода. Когда нужно контролировать поведение предупреждений в проекте — например, подавлять их или превращать в ошибки, — теперь можно определить поведение предупреждений прямо в коде с помощью нового атрибута
@diagnose(SE-0522).Уточнение, какой API использовать при конфликте нескольких библиотек. Когда несколько модулей определяют одно и то же имя API, которое вы хотите использовать, можно указать, какой именно модуль вы имели в виду, с помощью селекторов модулей. Если ваше приложение импортирует два модуля, оба из которых предоставляют тип
CommonThing, использование селектора::позволяет чётко указать, какой из них вы намереваетесь использовать (SE-0491).Вызов асинхронных функций в блоке
defer. Любой асинхронный код, написанный вами в блокеdefer, ожидается и выполняется до завершения перед выходом (SE-0493).Гарантия того, что необходимая работа по очистке не будет отменена. Вы можете выполнить замыкание, защищённое от отмены охватывающей задачи, через API
withTaskCancellationShield(SE-0504).
Вы можете комбинировать асинхронные вызовы в блоках defer и щиты отмены, чтобы гарантировать, что работа по очистке всегда выполняется, независимо от того, как функция возвращает управление:
func processFile(at url: URL) async throws {
let handle = try FileHandle(forReadingFrom: url)
defer {
// flushMetrics — это сетевой вызов, поэтому он может приостановиться
// после запроса отмены; щит гарантирует, что он выполнится до
// завершения и не будет включён в отмену.
await withTaskCancellationShield {
await flushMetrics(for: url)
try? handle.close()
}
}
try await processContents(of: handle)
}
Более богатые API основной библиотеки
Улучшения в Foundation и стандартной библиотеке упрощают использование современных API с существующими типами. Например, ProgressManager получил API для поддержки async/await (SF-0023), а типы @Observable теперь имеют детализированные и непрерывные уведомления об изменениях (SE-0506).
Библиотека Subprocess — изначально представленная как SF-0007 и выпущенная как начальная версия 0.1 в 2025 году — достигла версии 1.0. Она предоставляет кроссплатформенный пакет для запуска подпроцессов и взаимодействия с ними, построенный с нуля с использованием конкурентности Swift. Следующий пример из Getting Started with Subprocess иллюстрирует запуск процесса и захват его вывода:
let result = try await Subprocess.run(
.name("ls"), arguments: ["-la"], output: .string(limit: 4096)
)
print(result.standardOutput)
Swift 6.4 упрощает миграцию существующих проектов на Swift Testing. Теперь можно безопасно использовать XCTAssert в тестах Swift Testing или #expect внутри XCTest (ST-0021), а также настраивать значения, отображаемые в неудачных ожиданиях, с помощью протокола CustomTestReflectable (ST-0022). swift test позволяет повторять тестовые случаи для фокусировки и экономии времени (ST-0024) и записывать вложения, соответствующие протоколу Transferable, на платформах Apple (ST-0023). У Swift теперь есть сайт документации, а содержимое документации для стандартной библиотеки стало открытым исходным кодом.
Более быстрая сборка, более понятная отладка, более широкая поддержка IDE
Swift 6.4 приносит ряд улучшений инструментов, которые делают повседневную разработку более надёжной — от отладки и сборки до поддержки редакторов:
Более надёжная отладка. Swift 6.4 завершает многолетнюю переработку того, как компилятор отслеживает модули Swift в отладочной информации — LLDB теперь импортирует модули через точное отслеживание зависимостей вместо неоднозначного поиска по имени. Отладочные сборки в Linux и Windows, а также пакеты dSYM в Darwin значительно уменьшаются, поскольку бинарные модули Swift больше не встраиваются в них. Прочитайте недавнюю публикацию в блоге Module Tracking in Swift Debug Info, чтобы узнать подробности.
Унифицированная система сборки для IDE. Swift Package Manager (SwiftPM) теперь использует Swift Build в качестве платформы сборки по умолчанию и включает генерацию Software Bill of Materials (SBOM) для Swift Package Manager (SE-0509), обеспечивая поддержку генерации документов SBOM в формате SPDX или CycloneDX. Подробнее об обновлениях SwiftPM читайте в примечаниях к выпуску SwiftPM 6.4, а о том, как сгенерировать SBOM, — в разделе Generating Software Bill of Materials (SBOM).
Более широкая поддержка Swift в IDE. Расширение VS Code для Swift теперь доступно в реестре Open VSX, поэтому оно работает не только в VS Code, но и в Cursor, Antigravity, Kiro и других инструментах разработки. Оно также включает интеграцию со Swiftly, что упрощает выбор и использование различных версий инструментальных цепочек Swift в вашем проекте.
Более глубокая интероперабельность и поддержка платформ
Интероперабельность Swift расширяет своё присутствие во всём стеке: от системного C++ до среды выполнения Java в Android, от WebAssembly (Wasm) в браузере до Embedded Swift на микроконтроллерах. Языковая интероперабельность в этом выпуске становится глубже.
C: Пара
@cс@implementationпозволяет использовать функцию Swift для предоставления реализации для заголовка C без отдельного объявления на C. Без@implementationкомпилятор генерирует объявление в создаваемом заголовке. В любом случае функции@cмогут получать безопасные обёртки, например функцию, использующуюSpanвместо пары «сырой указатель + счётчик».C++: Swift 6.4 связывает
std::spanиз C++20 сSpanв Swift, поэтому вы можете передатьSpanв C++ API, который ожидаетstd::span, и получитьstd::spanобратно какSpan, не writing ручной код преобразования на границе.Java: Проект Swift/Java interop, который позволяет вызывать Swift из Java и Kotlin, расширяет поддержку вызова async и throwing функций для протокольных и callback-обёрток, добавляет автоматическое сопоставление
Runnableдля замыканий, импорт вариативных параметров и поддержку типов записей Java.
Поддержка платформ в Swift также углубляется.
WebAssembly
JavaScriptKit имеет лучшую производительность при связывании с Wasm в Swift 6.4: безопасное связывание стало до 40 раз быстрее, чем предыдущее динамическое. Wasm SDK доступен на странице Install Swift сайта Swift.org, поэтому для компиляции Swift под браузер не требуется никакой дополнительной настройки, кроме добавления SDK. Обновления Foundation для Swift 6.4 улучшают поддержку FileManager в WASI (WebAssembly System Interface).
Android
Swift на Android продолжает развиваться. Этот выпуск Swift SDK для Android собран с новым LTS NDK 30, который предоставляет атрибуты доступности Android как в библиотеках среды выполнения Swift, так и для ваших Swift-пакетов, использующих NDK по умолчанию. Swift Build теперь поддерживает Android и в SwiftPM, устраняя необходимость в скрипте пост-установки.
Embedded Swift
Более ранняя публикация Embedded Swift Improvements Coming in Swift 6.4 подробнее описывает другие улучшения Embedded Swift в этом выпуске, включая обобщённую поддержку экзистенциальных типов (таких как any Protocol), что позволяет естественным образом выражать гетерогенные коллекции и генерировать/перехватывать любые Error. Embedded Swift также получает новое предупреждение EmbeddedRestrictions, которое можно включить для всей цели:
// Package.swift — включить предупреждения EmbeddedRestrictions для цели
.target(
name: "FirmwareCore",
swiftSettings: [
.treatWarning("EmbeddedRestrictions", as: .warning)
]
)
Более быстрый код с сохранением безопасности
Swift 6.4 упрощает избегание ненужного копирования данных при сохранении безопасности памяти, продолжая более раннюю работу над Span, некопируемыми типами и InlineArray.
Работа со значениями в памяти без их копирования. Аксессоры
borrowиmutateпозволяют читать или обновлятьSpanилиInlineArrayчерез свойство (SE-0507), некопируемые типы теперь могут соответствоватьEquatable,ComparableиHashable, а новые типыRefиMutableRefдают полноценный, сохраняемый контейнер, позволяющий заимствовать или изменять одно значение за раз (SE-0519). Опциональные значения некопируемых типов теперь работают так же, поэтому можно inspect или обновлять содержимоеOptional, не потребляя его (SE-0532).Создание коллекций и значений в куче без ненужного выделения памяти.
UniqueBoxдаёт умный указатель, который единолично владеет значением в куче, включая некопируемые значения, без подсчёта ссылок (SE-0517).UniqueArrayхранит некопируемые элементы без выделений copy-on-write, которые вы бы увидели при использованииArray, и предоставляет буфер, который динамически растёт (SE-0527). Можно перебирать элементы и заимствовать их с помощью протоколаIterableвместо копирования каждого значения, что выходит за рамки возможностей протоколаSequence(SE-0516).Безопасный доступ к сырой памяти без использования API с пометкой
unsafe.withTemporaryAllocationпредоставляет временный буфер, который автоматически инициализируется и очищается (SE-0524). Новый безопасный API загрузки позволяетRawSpanи его вариантам безопасно загружать и сохранять байты, заменяя функции с пометкойunsafe(SE-0525).
Благодарности
Swift 6.4 отражает вклад многих людей из сообщества Swift — через код, предложения, обсуждения на форумах и обратную связь. Мысли и реальный опыт сообщества дают бесценные идеи и мотивацию! Если вы хотите принять участие в том, что будет дальше, Swift Forums — отличное место для начала.
Начало работы со Swift 6.4
Попробуйте Swift 6.4 сегодня, следуя инструкциям на странице Install Swift, или загрузите новую инструментальную цепочку 6.4 с помощью Swiftly.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.