Язык Swift имеет сигнатуру функции, которая сильно отличается от JS. Однако, помимо этого, концепция и использование функций и замыканий хорошо знакомы разработчику JS, который привык передавать обратные вызовы и писать замыкания.

Давайте взглянем на наглядную сигнатуру функции:

Первая очевидная вещь: чтобы объявить функцию в Swift, мы используем funcвместо function.

Затем начинается самая запутанная часть: для каждого параметра в сигнатуре функции может быть два имени перед типом. Первый также называется меткой параметра, который используется при вызове функции (как в случае с param1 в примере выше). Второй — это имя параметра, которое должно использоваться внутри тела функции при обращении к параметру.

Если метка в подписи представляет собой символ подчеркивания _, это означает, что вы можете просто передать значение параметра без использования метки (как в случае с param2 в приведенном выше примере). Когда для параметра имеется только одно имя/метка (как в случае с param3), это имя должно использоваться как внутри тела функции, так и при вызове функции.

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

(1) Функции внутри другой функции. Внутренняя функция имеет доступ к переменным внешней функции.

(2) Возврат функции. Обратите внимание, что возвращаемый тип записывается как сигнатура анонимной функции, с типом параметра в круглых скобках и стрелкой к возвращаемому типу, заключенным в другую пару круглых скобок.

(3) Передача функции в качестве параметра. Обратите внимание, как тип параметра записывается как сигнатура анонимной функции после метки/имени параметра, с типом параметра в круглых скобках и стрелкой, указывающей на возвращаемый тип.

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

Сделав еще один шаг вперед с этим выражением фигурные скобки…в, мы можем сохранить круглые скобки и тип возвращаемого значения, написав все в одной строке:

Наконец, при доступе к параметрам по индексу ($0, $1 и т. д.) можно также опустить in. И если это очень короткое замыкание является единственным параметром, передаваемым в функцию, скобки также можно опустить, оставив только фигурные скобки.