История вопроса: Trailing closure syntax — синтаксическая конструкция Swift, введенная для повышения читабельности кода при использовании закрывающих в конце функции блоков (closures). Она облегчает работу с большими и вложенными замыканиями, особенно в функциональном и декларативном стиле.
Проблема: Стандартное объявление замыканий с множеством скобок усложняет визуальную структуру кода, делает его менее понятным:
UIView.animate(withDuration: 0.3, animations: { ... })
С ростом размера closure этот код становится менее читаемым.
Решение: Swift позволяет выносить последний аргумент-функцию за скобки:
UIView.animate(withDuration: 0.3) { // анимационный блок }
Если замыканий два и больше, trailing closure syntax возможна только для последнего closure-параметра, остальные должны указываться в круглых скобках.
Ключевые особенности:
Можно ли применять trailing closure syntax, если closure — не последний параметр функции?
Нет, только последний параметр может быть оформлен trailing closure. Если требуется более одного closure, только последний может быть вынесен после скобок, остальные передаются внутри круглых скобок.
func fetch(url: String, completion: () -> Void, onError: () -> Void) fetch(url: "...", completion: { ... }) { // onError }
Можно ли опустить круглые скобки при вызове метода с одним аргументом-closure?
Да, если функция принимает единственный аргумент, который является closure, скобки можно опустить вовсе:
func doWork(action: () -> Void) doWork { print("Задача") }
Можно ли использовать trailing closure для функций с variadic параметрами после closure?
Нет, trailing closure syntax применима только если closure — последний аргумент. После него не может быть ни variadic, ни других параметров. Следующее вызовет ошибку:
func test(x: () -> Void, y: Int...) // ... вызов невозможен с trailing closure
Вызов с двумя closure-параметрами оформлен без trailing syntax, за счет чего метод занимает 5 экранов по вертикали, сложность понимания растет.
Плюсы:
Минусы:
В реализации UICollectionViewCompositionalLayout используется trailing closure — блок лейаута легко читается, структура визуально отображает иерархию layout-компонентов.
Плюсы:
Минусы: