Вы можете смотреть на замыкания так же, как на функции.В Swift замыкания и функции имеют одинаковый тип.Но функции имеют имена и не захватывают переменные в области видимости.
Вы написали краткий синтаксис замыкания, в полном синтаксисе замыкание имеет список параметров, список захвата и возвращаемое значение.Полный синтаксис слишком многословен:
{ [weak self] (a : AClass) -> BClass in
return BClass()
}
Вы можете опустить тип возвращаемого значения, типы параметров и список захвата, компилятор выведет его через контекст.
По умолчанию закрытие захватывает переменные с помощью сильных ссылок дляклассы и ссылки на структуры (вы можете изменить значение экземпляров структуры из замыкания).
var s = Struct()
let closure = {
s.a = 5;
}
closure()
Об асинхронном вызове замыканий
Говорят, что замыкание экранирует функциюкогда замыкание передается в качестве аргумента функции, но вызывается после ее возврата.
Это означает, что замыкание будет иметь сильные ссылки для всех переменных, упомянутых в теле замыканий.Чтобы избежать сильных ссылок на self, я использую следующий трюк:
let closure = { [weak self] () -> Void in
guard let self = self else {
return
}
//do some work
}
Посмотрите на замыкания как на функции без имени или как на функтор (в терминах C ++), который создается компилятором, и все будет хорошо.
Здесь вы можете прочитать о синтаксисе замыканий.Также замыкания в swift аналогичны блокам в Objective-C и лямбдам в C ++.