В чем разница между функциями и закрытием?

Я читал быстрое руководство по программированию в iBooks. Может кто-нибудь объяснить мне, в чем разница между функцией и закрытием. Это просто, что он не имеет имени и может использоваться в выражениях?

Ответ 1

Функции, по сути, называются только закрытыми. Следующие, по крайней мере, концептуально эквивалентны:

let foo = { println("hello") }

func foo()->(){ println("hello") }

Это становится немного более сложным в случае использования func для объявления методов, так как там добавляются некоторые интересные куски сахара, касающиеся автоматической вставки публичных именованных параметров и т.д. func myMethod(foo:Int, bar:Int, baz:Int) становится func myMethod(foo:Int, #bar:Int, #baz:Int), например,

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

Ответ 2

Сначала начнем с определение Closure, как показано в Википедии:

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

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

Определение Closure in Swift является строковым с lambdas и блоками на других языках, таких как С# и Ruby.

Что касается отличия от функций, из документа Swift:

Глобальные и вложенные функции, введенные в Функции, на самом деле специальные случаи закрытия

Таким образом, все функции - это, по сути, замыкания, которые хранят ссылки на переменные в их контексте.

Closure expressions являются удобным способом записи замыканий и обеспечивают более краткий синтаксис.