Карточка Middle Swift Concurrency спрашивают часто обновлено

Обернуть callback-API в async

Вопрос

Как превратить API с completion handler в async-функцию?

Попробуйте сами

Ответьте про себя или вслух, потом откройте ответ и сверьтесь.

Показать ответ и разбор

Коротко

try await withCheckedThrowingContinuation { cont in legacy { result in cont.resume(with: result) } }. Продолжение нужно возобновить ровно один раз.

Ответ

try await withCheckedThrowingContinuation { cont in legacy { result in cont.resume(with: result) } }. Продолжение нужно возобновить ровно один раз.

Разбор

Двойной resume это крэш, пропущенный навсегда подвешивает задачу. Checked-вариант пишет об этом в лог, unsafe быстрее, но без проверок.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.