Замыкания - это самодостаточные блоки с определенным функционалом, которые могут быть переданы и использованы в вашем коде. Замыкания могут захватывать и хранить отношения для любых констант и переменных из контекста, в котором они объявлены. Эта процедура известна как заключение этих констант и переменных, отсюда и название "замыкание". Swift выполняет всю работу с управлением памятью при захвате за вас.
Синтаксис замыкающего выражения имеет следующую общую форму:
{ (параметры) -> тип результата in выражения }
Синтаксис замыкающего выражения может использовать сквозные параметры. Значения по умолчанию не могут быть переданы. Вариативные параметры могут быть использованы в любом месте в списке параметров. Кортежи также могут быть использованы как типы параметров и как типы возвращаемого значения. Пример ниже показывает версию функции backwards(_:_:) с использованием замыкающего выражения:
reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in return s1 > s2 })
Для однострочных замыкающих выражений, параметры и тип возвращаемого значения пишутся внутри фигурных скобок, а не вне их. Начало тела замыкания содержит ключевое слово in. Это ключевое слово указывает, что объявление параметров и возвращаемого значения замыкания закончено, и тело замыкание вот-вот начнется.
|
|
Экземпляр блока, тип блока и сам блоковый литерал обозначаются с помощью оператора ^, пример:
typedef int (^MyBlock)(int); int multiplier = 7; MyBlock myBlock = ^(int num) { return num * multiplier; }; или
int multiplier = 7; int (^myBlock)(int) = ^(int num) { return num * multiplier; }; Вызов блока аналогичен вызову обычной сишной функции. Например, так: myBlock(3) Главной особенностью блоков является их умение хранить контекст в котором они создавались. В примере выше «myBlock» всегда будет умножать число на 7.