如何创建内联匿名函数,以便在函数调用中立即使用?

rad*_*vus 5 parameters syntax anonymous-function swift

我有一个我创建的 Swift 函数,它接受一个函数作为参数:

func doMath(_ f:(_ i1 : Int, _ i2 : Int) -> 
          (), _ i1: Int, _ i2: Int) {
    print("doing Math")
    f(i1, i2)
}
Run Code Online (Sandbox Code Playgroud)

该函数采用两个参数(均为 Int)并且不返回任何内容。

我可以使用非匿名函数通过以下代码成功调用该方法。

func add(_ m1:Int, _ m2: Int){
    print (m1 + m2)
}

doMath(add, 3,5)
Run Code Online (Sandbox Code Playgroud)

当 doMath 被调用时,它会打印:

做数学

然后调用 add 函数,然后打印:

8

什么语法允许doMath使用匿名函数调用函数?

我试过的

  • 我正在阅读Matt Neuberg所著的iOS 12 Programming Fundamentals with Swift这本书,但他跳过了用参数解释匿名方法。
  • 我用谷歌搜索过,但找不到我能弄清楚的快速例子。
  • 我尝试了许多变体,以下是我最接近的,但出现如下所示的错误:

doMath(5,8, { 
   (m1:Int, m2:Int) -> ()  in  
   print(m1 * m2) 
 })
Run Code Online (Sandbox Code Playgroud)

我收到一个错误,指出:

错误信息

Mar*_*n R 6

func doMath\xe2\x80\x93 正如您所定义的那样 \xe2\x80\x93 将闭包作为第一个参数,\n并将两个整数作为第二个和第三个参数。因此你称其为

\n\n
doMath({\n    (m1:Int, m2:Int) -> ()  in\n    print(m1 * m2)\n}, 5, 8)\n
Run Code Online (Sandbox Code Playgroud)\n\n

或使用简写参数:

\n\n
doMath({ print($0 * $1) }, 5, 8)\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果更改函数定义以将闭包作为最后一个\n参数

\n\n
func doMath(_ i1: Int, _ i2: Int, _ f:(_ i1 : Int, _ i2 : Int) -> ()) {\n    print("doing Math")\n    f(i1, i2)\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

那么你可以称之为

\n\n
doMath(5, 8, { print($0 * $1) })\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者,使用 \xe2\x80\x9ctrailing 闭包\xe2\x80\x9d\xc2\xa0 语法:

\n\n
doMath(5, 8) { print($0 * $1) }\n
Run Code Online (Sandbox Code Playgroud)\n