Swift 6.2: что на самом деле включено по умолчанию 🔥
🧵 В Swift 6.2 приехали две большие штуки про изоляцию — и ни одна из них не включена по умолчанию. SE-0461 (nonisolated async остаётся на акторе вызывающего) сидит за upcoming-фичей NonisolatedNonsendingByDefault, а она становится дефолтом только в language mode Swift 7. В Swift 6 без флагов вы получаете старое поведение SE-0338: функция по-прежнему уходит на глобальный executor. SE-0466 («всё @MainActor по умолчанию») — вообще не upcoming-фича, а отдельный флаг -default-isolation MainActor. Авторы сознательно не сделали её upcoming: для библиотек и серверных приложений MainActor по умолчанию — неправильный дефолт.
💡 Почему все путаются: шаблон нового проекта в Xcode 26.2 включает Approachable Concurrency и Default Actor Isolation = MainActor. Люди видят, что nonisolated async крутится на главном потоке, и решают, что это язык. Тот же компилятор на SwiftPM-пакете ведёт себя ровно наоборот.
⚠️ Ещё нюанс, которого нет в тексте пропозала — он виден только в исходниках компилятора: -default-isolation MainActor молча включает ещё и InferIsolatedConformances (SE-0470) с NoExplicitNonIsolated. А вот NonisolatedNonsendingByDefault не включает — это ортогональные настройки, которые постоянно смешивают.
· 06.08
в package.swift лучше сразу явно прописать isolation-флаги, а не полагаться на дефолты xcode-шаблона — иначе ci на swiftpm и локальная сборка в xcode будут молча расходиться. мы на одном проекте словили ровно это: в xcode всё крутилось на mainactor, а в ci-пакете улетало на глобальный executor, и гонку ловили неделю. явный флаг в манифесте — скучно, зато не надо гадать, какой у тебя language mode на самом деле
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
коммент удалён