Что такое закрытие?

Замыкания — это автономные блоки функций, которые можно передавать и использовать в вашем коде.

Они могут быть трех видов: глобальные функции, вложенные функции и замыкающие выражения.

Вот некоторые концепции, которые вам нужно понять.

  1. Вы можете назначить функцию для переменных. Его также можно использовать для передачи в качестве аргумента в другую функцию и из нее.

Вы можете легко использовать эти функции для использования функций «высокого порядка», встроенных в Swift. Функции высокого порядка принимают функции в качестве аргументов и применяют их полезными способами.

Вот пример map — функции высокого порядка, используемой в массивах.

2. Функции могут «захватывать» значения в том контексте, в котором они объявлены.

3. Два способа создания функций: с ключевым словом func или с замыкающими выражениями { }

Вот функция triple, написанная с замыкающим выражением.

Оба объявления выше равны. Объявляя функцию таким образом, вы создаете функциональный литерал. Функция не имеет имени и может использоваться только при назначении переменной.

Итак, вернемся к закрытиям

Используя наш образец выше, используя карту функции высокого порядка. На самом деле мы можем написать это так.

Довольно круто, да?

Давайте шаг за шагом рассмотрим, как мы достигли приведенного выше синтаксиса.

  1. Нет необходимости передавать выражение замыкания в локальную переменную, так как вам нужно только вернуть результат вычисленных значений. Вы можете напрямую поместить замыкание в карту функций.
1. [1, 2, 3, 4, 5].map( { (i: Int) -> Int in return i * 3} )

2. Из-за вывода типа вам не нужно указывать тип передаваемых литералов при использовании выражений замыкания. Мы знаем, что массив и возврат будут целочисленными, поэтому мы можем отключить Int.

2. [1, 2, 3, 4, 5].map( { i in return i * 3} )

3. У нас есть только одно выражение, Swift может автоматически возвращать значение выражения без использования синтаксиса возврата. Ага, сними это.

3. [1, 2, 3, 4, 5].map( { i in i * 3} )

4. Swift имеет встроенные сокращенные имена для аргументов функций ($0 — первый параметр, $1 — второй параметр и т. д.)

4. [1, 2, 3, 4, 5].map( { $0 * 3 } )

5. Выражение замыкания можно переместить за скобки, если оно находится в последнем аргументе вызова функции.

//Think if ( expression ) { } 
5. [1, 2, 3, 4, 5].map() { $0 * 3 }

6. Если у функции нет аргументов, кроме замыкающего выражения, скобки можно не ставить.

5. [1, 2, 3, 4, 5].map{ 0 * 3 } // [3, 6, 9, 12, 15]

Зачем использовать замыкание?

Если вам нужен чистый, читаемый, короткий код, используйте замыкания. Это очень удобный способ дать функциям доступ к своему локальному состоянию. Вы можете определить функцию на месте, и она будет неявно обращаться ко всем видимым в данный момент переменным.

Больше образцов закрытия

var names = ["Mickey", "Minnie", "Donald", "Goofy"] 
var reversedName = names.sorted(by: > ) //in sort
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
var evenNumbers = numbers.filter { $0 % 2 == 0 } 
    //evenNumbers = [2, 4, 6, 8]
numbers = [1, 2, 3, 4, 5]
var sum = numbers.reduce(0) { $0 + $1 } //15

Это никоим образом не глубокая статья о замыканиях. Для получения дополнительной информации посетите: