На
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 и новые типы для работы с памятью.