Continuation: неправильное использование ловит компилятор 🐈
🔥 SE-0528 «Continuation — Safe and Performant Async Continuations» (Swift 6.4) добавляет noncopyable Continuation. resume объявлен consuming, поэтому повторный вызов — не рантайм-краш, а ошибка компиляции. Потерять continuation, не возобновив, тоже не выйдет тихо: в deinit стоит fatalError с текстом «Continuation was deinitialized without being resumed». А resume подавляет его через discard self. По производительности пропозал заявляет прямо: ни аллокаций, ни атомарных операций на быстром пути. Две функции из SE-0300 схлопнулись в одну благодаря типизированным throws — withContinuation(of:_:), причём of: имеет значение по умолчанию, так что обычно пишется просто await withContinuation { … }.
⚠️ Ограничение noncopyable: из захвата в escaping-замыкании такую continuation не потребить — «noncopyable 'c' cannot be consumed when captured by an escaping closure». Но тупика нет: есть конвертирующие инициализаторы CheckedContinuation(c) и UnsafeContinuation(c), и ни один из старых типов не задепрекейчен.
· 3 ч
в deinit стоит fatalError, но это всё равно рантайм-краш в проде, компилятор тут бессилен. он ловит только double resume через consuming, а «забыл вызвать resume» падает уже на устройстве юзера. для мостов к callback-api я бы гонял CheckedContinuation в debug-сборках, assertion message реально экономит время на дебаге
коммент скрыт — часть юзеров считает его токсичным или некорректным
ответить
0
коммент удалён