Что такое @autoclosure в Swift?

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

Ответ

@autoclosure — это атрибут параметра функции, который автоматически оборачивает переданное выражение в замыкание. Это позволяет отложить вычисление выражения и упростить синтаксис вызова.

Как это работает: Без @autoclosure вам пришлось бы явно передавать замыкание. С ним выражение оборачивается автоматически.

Пример:

// Функция с autoclosure
func assertOrLog(_ condition: @autoclosure () -> Bool, _ message: String) {
    if !condition() { // Вычисление происходит только здесь
        print("Assertion failed: (message)")
    }
}

let expensiveValue = someExpensiveCalculation()

// Вызов: выражение `expensiveValue > 0` автоматически становится замыканием { expensiveValue > 0 }
assertOrLog(expensiveValue > 0, "Value must be positive")

Ключевые особенности и применение:

  • Отложенное выполнение: Выражение вычисляется только при явном вызове замыкания внутри функции.
  • Синтаксический сахар: Позволяет опустить фигурные скобки {}, делая вызов похожим на передачу обычного значения.
  • Оптимизация: Полезно, когда вычисление выражения затратно и может не потребоваться.
  • Использование в стандартной библиотеке: Широко применяется в операторах &&, ||, функции assert() и операторе объединения по nil (??).

Важно: По умолчанию @autoclosure создает non-escaping замыкание. Если нужно сохранить его для последующего использования, укажите @autoclosure(escaping).