Добавить объявление

Что нового в Swift 6.4. Разбираем изменения с WWDC26

На WWDC26 компания Apple представила Swift 6.4 - очередное обновление языка, которое делает повседневный код чище и выразительнее. В этом материале - самое важное из того, что появилось в новой версии.

anyAppleOS - теперь доступность проще:


Раньше, чтобы указать, что API доступен на всех платформах Apple, приходилось перечислять каждую ОС отдельно. В Swift 6.4 это можно сделать одной строкой.

// Было
@available(macOS 27, iOS 27, watchOS 27, tvOS 27, visionOS 27, *)
func showStatus() { ... }

// Стало
@available(anyAppleOS 27, *)
func showStatus() { ... }

Если для одной платформы нужно другое поведение, можно комбинировать anyAppleOS с переопределением. Тот же токен работает внутри #if os(anyAppleOS).

@diagnose - точное управление предупреждениями:


Новый атрибут @diagnose позволяет управлять предупреждениями на уровне отдельных объявлений. Можно подавить предупреждение, превратить его в ошибку или оставить как есть.

@diagnose(DeprecatedDeclaration, as: ignored, reason: "Миграция постепенно")
func makeApolloMission() -> Mission {
CrewedMission(rocket: makeSaturnIRocket(), ...)
}

Это точечный инструмент, а не флаг на весь проект. Особенно полезно при поэтапной миграции или проверке критических участков кода.

Что нового в работе с Sendable:


В Swift 6.4 исправили несколько мелких неудобств.

weak var раньше требовал @unchecked Sendable. Теперь можно писать weak let и это проходит обычную проверку Sendable.

final class Spacecraft: Sendable {
weak let dockedAt: SpaceStation?
}

Если класс должен явно отказаться от Sendable, теперь это можно указать через ~Sendable.

class Mission: ~Sendable { ... }

Async внутри defer:


Раньше вызвать асинхронную функцию из блока defer было нельзя - приходилось писать обходные решения. В Swift 6.4 это ограничение убрали.

defer {
await logger.flush()
}

Защита от отмены задачи:


withTaskCancellationShield создает участок кода, где Task.isCancelled всегда возвращает false. Это нужно для операций, которые должны завершиться даже после отмены задачи - например, сброс буфера файла, чтобы избежать повреждения данных.

extension EmergencyTransponder {
func sendSOS() {
withTaskCancellationShield {
radio.send(makeSOSPacket())
}
}
}

mapKeyedValues для словарей:


Существующий mapValues передает в замыкание только значение. Новый mapKeyedValues дает и ключ и значение.

let displayNames = missions.mapKeyedValues { mission, window in
makeDisplayName(for: mission, in: window)
}

FilePath в стандартной библиотеке:


Тип FilePath переехал из Swift System в стандартную библиотеку. Он корректно обрабатывает различия в представлении путей между платформами и парсит компоненты единообразно.

var path: FilePath = "/Users/khoa/Documents"
path.components.append("Projects")
path.components.append("app")
print(path.components)
// [ "Users", "khoa", "Documents", "Projects", "app" ]

Управление памятью и производительность:


Для тех, кто пишет высокопроизводительный код, добавили:

  • @inline(always) - принудительный инлайн.

  • @specialized - специализация дженериков под конкретные типы.

  • borrow и mutate аксессоры - доступ к данным без лишнего копирования.

  • Новые типы в стандартной библиотеке: UniqueBox, UniqueArray, Ref, MutableRef.

Вывод:


Swift 6.4 - не революционный, но очень плотный релиз. Apple сфокусировалась на том, чтобы убрать мелкую боль из повседневного кода и одновременно добавить инструменты для высокопроизводительной и кроссплатформенной разработки.

Из новинок стоит обратить внимание на anyAppleOS, @diagnose, улучшения при работе с Sendable и новые типы для работы с памятью.
13.07.2026 42 600