顶级语句不能以闭包表达式开头

top-level statement cannot begin with a closure expression

我正在使用这个 online compiler 学习 Swift 中的匿名函数和“定义并调用”函数(因为我没有 Mac),并且我编写此代码以通过创建一个匿名函数来尝试我所学到的知识,该函数将两个数字相加并打印结果:

{
    (a:Int, b:Int) -> Void in
    print(a + b)
} (2,3)

当我尝试运行这个函数时,编译器给我一个错误:

main.swift:10:1: error: top-level statement cannot begin with a closure expression
{
^


...Program finished with exit code 0

我通过创建第二个函数来解决这个问题:

func doIt() {
    {
        (a:Int, b:Int) -> Void in
        print(a + b)
    } (2,3)
}

doIt()

但是,我不确定这是否是正确的方法,因为我不明白为什么编译器不让我 运行 调用匿名函数。编译器还提到我写的文件 main.swift,我听说它允许可执行代码在顶层 运行。

有人可以指导我正确的方向吗?

源码里好像有解释原因:

  // Expressions can't begin with a closure literal at statement position.
  // This prevents potential ambiguities with trailing closure syntax.
  if (Tok.is(tok::l_brace)) {
    diagnose(Tok, diag::statement_begins_with_closure);
  }

如果您想直接运行,可以将代码包装在 do {}

do {
    { (a:Int, b:Int) -> Void in
        print(a + b)
    } (2,3)
}

或者您可以从闭包中创建一个变量,然后使用该变量调用它

let doIt = { (a:Int, b:Int) -> Void in
    print(a + b)
}

doIt(2,3)