Ответ
Ключевое слово rethrows указывает, что функция пробрасывает ошибку только в том случае, если один из её параметров-замыканий (throws) завершился с ошибкой. Если все переданные не-throwing замыкания, функцию можно вызывать без try.
Это делает API более чистым и гибким, так как не навязывает обработку ошибок там, где она не требуется.
Пример:
// Функция map, которая rethrows.
func customMap<T>(_ items: [Int], transform: (Int) throws -> T) rethrows -> [T] {
var result = [T]()
for item in items {
result.append(try transform(item))
}
return result
}
// 1. Вызов с НЕ-throwing замыканием. `try` не нужен.
let mapped1 = customMap([1, 2, 3]) { $0 * 2 }
// 2. Вызов с throwing замыканием. Требует обработки ошибок.
let mapped2 = try customMap([1, 2, 3]) { num in
if num == 2 { throw ValidationError.invalidValue }
return num * 3
}
Правила:
- Функция с
rethrowsдолжна иметь хотя бы один throwing-параметр (обычно замыкание). - Внутри функции к throwing-замыканиям нужно применять
try. - Это ключевая особенность многих стандартных функций Swift, таких как
map,filter,forEach.