Я читал быстрое руководство по программированию в 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
являются удобным способом записи замыканий и обеспечивают более краткий синтаксис.