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

时间:2018-11-20 19:06:41

标签: swift syntax parameters anonymous-function

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

func doMath(_ f:(_ i1 : Int, _ i2 : Int) -> 
          (), _ i1: Int, _ i2: Int) {
    print("doing Math")
    f(i1, i2)
}

该函数接受两个参数(均为Int),但不返回任何内容。

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

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

doMath(add, 3,5)

调用doMath时,它会打印:

  

做数学

然后调用添加功能, 然后打印:

  

8

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

我尝试过的事情

  • 我正在读iOS 12 Programming Fundamentals with Swift by Matt Neuberg这本书,但他跳过了用参数解释匿名方法的事情。
  • 我已经在Google上搜索和搜索过,但找不到我可以弄清楚的快速示例。
  • 我尝试了许多变体,以下是我最接近的变体,但出现以下错误:

doMath(5,8, { 
   (m1:Int, m2:Int) -> ()  in  
   print(m1 * m2) 
 })

我收到一条错误消息,指出:

error msg

1 个答案:

答案 0 :(得分:3)

func doMath(如您所定义)将闭包作为第一个参数, 和两个整数作为第二个和第三个参数。因此,您将其称为

doMath({
    (m1:Int, m2:Int) -> ()  in
    print(m1 * m2)
}, 5, 8)

或带有简写参数的

doMath({ print($0 * $1) }, 5, 8)

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

func doMath(_ i1: Int, _ i2: Int, _ f:(_ i1 : Int, _ i2 : Int) -> ()) {
    print("doing Math")
    f(i1, i2)
}

然后您将其称为

doMath(5, 8, { print($0 * $1) })

或使用“尾随闭包”语法:

doMath(5, 8) { print($0 * $1) }