Ответ
@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).