На 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" ]
🔗 Читать подробнее
💡 Вывод:
Swift 6.4 - не революционный, но очень плотный релиз. Apple сфокусировалась на том, чтобы убрать мелкую боль из повседневного кода и одновременно добавить инструменты для высокопроизводительной и кроссплатформенной разработки.
Из новинок стоит обратить внимание на anyAppleOS,
@diagnose, улучшения при работе с Sendable и новые типы для работы с памятью.Подписаться на канал:
➡️ Telegram | Max
Закрытый канал:
🚀 Мобильный трудоголик PRO