Об этом часто говорят в терминах Swift. Но что это?

Swift позволяет использовать функции как любое значение при использовании в языке. Это в просторечии означает, что функции - это граждане первого класса. Если вам нужен полный пример этого, прокрутите статью вниз и посмотрите (есть Gist, чтобы вы могли скопировать и вставить код прямо в площадку или приложение для одного просмотра!)

Терминология

функция: группа операторов, которые вместе могут выполнять какое-либо действие

Передача функций

Мы можем передавать функции по нашему коду, обращаясь с ними так же, как с переменными, и перемещать выполнение функции по коду.

Это можно рассматривать как перемещение инструкций по коду - как передачу инструкций по коду для повторного выполнения в более позднее время.

Эта проблема

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

Для синхронного кода (то есть когда код запускается, текущий поток будет ждать, пока код не будет завершен) следующее допустимое решение:

Обработчик завершения

Однако для асинхронного кода (например, сетевого кода) программа может работать некорректно. Решением может быть запуск обработчика завершения

Назначьте функции переменным

Автономные блоки кода в Swift называются закрытием. Эти замыкания могут быть присвоены переменной, которая затем может быть передана по коду (и даже другой функции), вызывается в подходящее время, и когда вызывается замыкание, выполняется код.

Вышеописанной функции whenComplete можно присвоить имя, поскольку в действительности она уже является переменной (для ясности я показал тип переменной, хотя вывод типа Swift разберутся с этим для вас).

Что затем может быть эффективно передано функции outputString(str:), как определено выше.

Должно быть ясно, что тип этого примера - ()->(), но для других типов обработчиков завершения (или замыканий, как вы хотите их называть!) Работают точно так же.

Забавный пример - калькулятор

Это то, что использует перечисления (извините, со связанными типами), функции и опции. Теперь давайте перейдем к примеру, который представляет собой забавный калькулятор (примечание: ваше определение веселья может отличаться от моего).

Я создал function вызванную операцию, которая вернет функцию типа ((Int, Int) -> Int)?, то есть функцию, которая имеет два входа типа Int и выводит тип Int. .

Пользователь этого общедоступного API может запросить функцию - теперь пользователь API, возможно, не сможет создать функцию или изменить ее, поэтому это помогает с идеей разделения проблем. enum гарантирует, что пользователь может запросить функцию, и ему совсем не нужно знать внутреннюю реализацию функции.

Ниже приводится лишь один из способов реализации такой вещи. Если вы хотите скопировать и вставить это в Playground, вы можете использовать ссылку на Gist чуть ниже кода!

Что это такое? ПРАКТИЧЕСКОЕ ИСПОЛЬЗОВАНИЕ для первоклассных функций? Я скорее думаю, что это так.

Пожалуйста.

Заключение

В этой статье мы познакомились с первоклассными функциями Swift с рядом примеров, которые вы можете написать в своем коде. Это может быть даже способ абстрагироваться от вашего кода и начать думать о том, как вы можете скрыть свой код от пользователей вашего API, и начать писать код, доступный для пользователей, простым и понятным для использования способом.

Надеюсь, эта статья вам помогла. Есть комментарии, вопросы или улучшения? Свяжитесь со мной в Твиттере, и я помогу вам.