#swift
#swift
Вопрос:
Я пытаюсь объявить закрытие, возвращающее пустоту, и использовать его сразу после другого выражения. Итак, я понимаю, что компилятор не «видит» пробел, но почему он думает, что у someFunc
есть аргумент закрытия, когда это явно не так? Другими словами, почему ;
необходимо?
func someFunc() {
}
func someFunc2() {
someFunc();
{ arg in
print("(arg 1)")
}(0)
}
Когда точка с запятой удаляется, xcode выдает ошибку «Аргумент, переданный вызову, который не принимает аргументов». Действительно ли это соответствует дизайну?
Комментарии:
1. Кто-то другой опубликовал ответ, но вы также можете выполнить
let closure = { arg in ... }
then callclosure(0)
. Это устранит двусмысленность.2. Проверка синтаксиса всегда предшествует любому дальнейшему анализу кода. Даже
someFunc()
не принимает никаких аргументов, синтаксисsomeFucn(){ }
, похоже, передает аргумент закрытияsomeFunc
, следовательно, дальнейший анализ кода не выполняется.
Ответ №1:
f { /* closure contents here */ }
это более распространенная форма завершающего замыкания, но скобки необязательно должны быть опущены (фактически, они необходимы, если перед замыканием есть другие параметры), что означает, что f() { /* closure contents here */ }
также является допустимым завершающим замыканием.
Некоторым людям нравится начинать {
с новой строки (я знаю, что это соглашение в C #, например), поэтому такое поведение, которое вы видите, похоже, предназначено для размещения таких людей.
Ответ №2:
Вы говорите, что «Я пытаюсь объявить закрытие, возвращающее пустоту». но вы не объявили закрытие в возврате функции
Итак, изменения:-
func someFunction() {
print("Some function is call")
}
func someFunction2() -> ((_ arg: Any) -> Void) {
someFunction()
return { arg in
print("Closure return")
}
}