Почему имена аргументов требуются для вызовов функций и не разрешены для функций, назначенных переменным?

#swift #function #syntax #arguments

#swift #функция #синтаксис #аргументы

Вопрос:

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

 func foo(bar: Any) {}
var faz = foo

foo(1) // Missing argument label 'bar:' in call
foo(bar: 1)
faz(1)
faz(bar: 1) // Extraneous argument label 'bar:' in call
  

Ответ №1:

Когда вы назначаете свой метод в качестве замыкания, вы просто назначаете типы параметров метода и возвращаемый тип, поэтому тип вашего замыкания на самом деле (Types of arguments) -> Return type

В вашем конкретном случае: (Any) -> Void

Как вы можете видеть, у этого замыкания нет имен для аргументов, и вы не можете их добавить. Таким образом, добавление метки аргумента при вызове вашего закрытия не сработает.

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

 faz = { bar in 
    ... // you can work with bar of type `Any`
}