Этот вопрос просто веселит Свифта.Пожалуйста, не принимайте это всерьез ...
В Свифте, учитывая эту функцию:
func greet(name: String) {
print("Hello \(name)!")
}
правильный способ его вызова такой:
greet(name: "Bob") // "Hello Bob!"
Если вы опустите метку аргумента name
:
greet("Bob")
, вы получите ошибку: Отсутствует метка аргумента 'name:' в вызове
Но обработка функции как замыкания позволяет вам вызывать ее без метки аргумента:
let g = greet; g("Bob") // "Hello Bob!"
Это заставило меня задуматься, каков наиболее краткий способ вызова функциибез использования метки аргумента?
Обернуть это в кортеж?
Я подумал обернуть функцию в кортеж и затем извлечьэто будет работать:
(greet).0("Bob")
, но это привело к ошибке: Значение типа '(String) -> ()' не имеет члена '0' .
Это работает:
(greet,greet).0("Bob") // "Hello Bob!"
Так что, очевидно, Swift рассматривает простые кортежи с 1 значением как только само значение.
Предоставление аргумента кортежа для метки работает:
(g:greet).g("Bob") // "Hello Bob!"
(g:greet).0("Bob") // "Hello Bob!"
Поместить его в массив?
Пока что самый краткий способ, который я нашел, - это поместить функцию в массив:
[greet][0]("Bob") // "Hello Bob!"
Этоиспользует только на 5 символов больше, чем greet("Bob")
, что представляется самым коротким из возможных вызовов , если бы он работал .
. Есть ли более короткий способ вызова функции greet(name:)
без использования аргументаярлык чем это?