Что такое typed throws (Swift 6)?
Суть
Typed throws (SE-0413, Swift 6.0) позволяют указать конкретный тип ошибки в сигнатуре: func parse() throws(ParseError) -> Int. До этого throws всегда означал any Error: в catch приходил экзистенциал, и чтобы перебрать варианты, нужны были касты as? ParseError плюс обязательная ветка «что-то ещё».
Эквивалентности: обычный throws = throws(any Error); небросающая функция = throws(Never). Поэтому старый код не меняется, а rethrows во многих случаях выражается через generic-параметр ошибки.
enum ParseError: Error { case empty, invalid(String) }
func parse(_ s: String) throws(ParseError) -> Int {
guard !s.isEmpty else { throw .empty }
guard let n = Int(s) else { throw .invalid(s) }
return n
}
do {
_ = try parse("x")
} catch { // error: ParseError, а не any Error
switch error { // исчерпывающий switch без default
case .empty: print("empty")
case .invalid(let s): print("invalid", s)
}
}
// Generic проброс ошибки вместо rethrows
func firstMap<T, U, E: Error>(
_ xs: [T], _ f: (T) throws(E) -> U
) throws(E) -> U? {
guard let x = xs.first else { return nil }
return try f(x)
}
let r: Int? = try? firstMap(["7"]) { s throws(ParseError) in try parse(s) }
print(r ?? -1) // 7
Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.
Полный ответ — в DevPrep