Async defer: await-уборка на каждом пути выхода 🚀
🔥 SE-0493 «Support async calls in defer bodies» (Swift 6.4) снимает запрет на await внутри defer. Теперь уборка живёт рядом с созданием ресурса и отрабатывает на любом выходе — return, throw, ранний выход.
⚠️ И вот важная поправка к формулировке, которая уже разошлась (в том числе у меня в прошлой карточке): утверждение, что deferred-тело не отменяемо, неверно. Такая альтернатива в пропозале рассматривалась и была явно отвергнута. Дословно: «если текущая задача отменена, весь код, вызванный из defer, увидит эту отмену — через Task.isCancelled, Task.checkCancellation() и так далее — ровно так же, как если бы он вызывался из тела функции». Экранирование отложили до отдельной фичи вроде withCancellationIgnored. Что действительно осталось запрещённым: бросать из defer по-прежнему нельзя. Диагностики throw_in_defer_body и throwing_op_in_defer_body никуда не делись, так что try внутри придётся гасить через try?, try! или do/catch. И ограничение по контексту: родительский контекст обязан быть async, иначе получите «'async' defer must appear within an 'async' context». В замыкании Task { } работает — оно выводит async из самого await.