Почему компилятор swift считает, что закрытие завершается?

#swift

#swift

Вопрос:

Я пытаюсь объявить закрытие, возвращающее пустоту, и использовать его сразу после другого выражения. Итак, я понимаю, что компилятор не «видит» пробел, но почему он думает, что у someFunc есть аргумент закрытия, когда это явно не так? Другими словами, почему ; необходимо?

 func someFunc() {

}

func someFunc2() {
    someFunc();

    { arg in
        print("(arg   1)")
    }(0)
}
  

Когда точка с запятой удаляется, xcode выдает ошибку «Аргумент, переданный вызову, который не принимает аргументов». Действительно ли это соответствует дизайну?

Комментарии:

1. Кто-то другой опубликовал ответ, но вы также можете выполнить let closure = { arg in ... } then call closure(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")
    }
}