Типичные случаи использования для закрытия:
Асинхронные вызовы; работа в сети.
Функции хранятся в виде переменных; продумайте действия и предоставленные обратные вызовы.
Планирование задач в очереди отправки.
Если есть процесс, для выполнения которого требуется некоторое время, чтобы выполнить работу и вернуть результат. В этих случаях закрытием являются лучшие варианты.
Не выходящие замыкания
Не выходящие замыкания имеют очень четкий жизненный цикл и стали типом замыкания по умолчанию в Swift 3 благодаря этому. Невыкрывающееся замыкание простое: оно передается в функцию (или другую, содержащую область), функция / область выполняет это замыкание, и функция возвращается. Закрытие не может вернуться или завершиться после выполнения тела вызывающей функции. В связи с этим компилятор может оптимизировать не-экранирующие замыкания по экранирующим замыканиям.
Поведение по умолчанию при закрытии (без экранирования)
Скажем за простую функцию с закрытием следующим образом:
func macICanBuy(budget: Int, closure: (String) -> Void) {
print("checking budget...")
closure("Mcdonalds' Big Mac")
print("macICanBuy finished execution")
}
override func viewDidLoad(){
macICanBuy(budget: 100, closure: { mac in
print("I can afford a \(mac)")
})
}
// output:
// checking budget...
// I can afford a Mcdonalds' Big Mac
// macICanBuy finished execution
Прежде чем приложение выполнит функцию macICanBuy, оно загрузит переданный параметр (бюджет и закрытие) в память телефона (RAM), чтобы функция могла использовать эти данные.
После того, как приложение завершит выполнение sh функции macICanBuy, приложению больше не нужны данные о бюджете и закрытии, поэтому оно удалит их из памяти. Данные замыкания не сумели избежать удаления из памяти после завершения выполнения функции, поэтому они называются «неэкранирующими» замыканиями.
Выше ссылка из:
https://fluffy.es/what-is-escaping-closure/