Что такое rethrows в Swift?

«Что такое rethrows в Swift?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ключевое слово 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.