DevPrep

Все темы › Современный Swift

Что такое typed throws (Swift 6)?

Senior PRO

Суть

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

Потренируйтесь перед собеседованием

В DevPrep эти ответы превращаются в задачи на минуту: что напечатает код, найди баг, пробное собеседование. По задаче в день.

Скачать DevPrep в App Store