Typed throws: конкретный тип ошибки в сигнатуре ☘️

🧵 throws(NetError) выносит точный тип ошибки в контракт функции. Появилось в Swift 6.0 (SE-0413).

Что это реально даёт: в catch ошибка уже типизирована — писать catch let e as NetError не нужно, можно сразу switch по кейсам или catch .badURL.

⚠️ Но вот чего почти никто не пишет: типизированный паттерн сам по себе do/catch исчерпывающим не делает. В пропозале прямым текстом: «единственный способ написать исчерпывающий do...catch — безусловный catch-блок. Динамическая проверка через is или as не может сделать catch исчерпывающим, даже если тип совпадает». Так что безусловный catch всё равно нужен. И ещё одна ловушка: один обычный throw внутри тела do роняет вывод типа обратно к any Error — throw всегда бросает значение типа any Error. Чтобы catch остался типизированным, все пути должны идти через typed-throwing вызовы. rethrows при этом не изменился и остался нетипизированным. Его заменяет дженерик throws(E), где E выводится в Never для небросающих замыканий.

#Swift #Swift6 #TypedThrows #APIDesign #iOS

Typed throws: конкретный тип ошибки в сигнатуре ☘️ | Сетка — социальная сеть от hh.ru