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

7
我有一个Swift函数,它接受一个函数作为参数:
func doMath(_ f:(_ i1 : Int, _ i2 : Int) -> 
          (), _ i1: Int, _ i2: Int) {
    print("doing Math")
    f(i1, i2)
}

该函数接受两个参数(均为Int类型),并不返回任何值。 < p > < em > 我可以使用非匿名函数成功调用该方法,以下是代码示例。

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

doMath(add, 3,5)

当调用 doMath 函数时,它会输出:

doing Math

然后调用 add 函数,该函数会输出:

8

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

我尝试过的:

  • 我正在阅读 Matt Neuberg 的 iOS 12 Programming Fundamentals with Swift,但他跳过了解释带参数的匿名方法。
  • 我已经进行了谷歌和搜索,但找不到我能够理解的 Swift 示例。
  • 我尝试了很多变化,以下是我最接近的,但我得到如下错误:

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

我收到一个错误提示,内容如下:

error msg


你的最后一次尝试几乎正确,只是参数的顺序错了:doMath({ .... }, 5,8) - Martin R
哦,等等,先是函数体再是参数?!?我尝试了所有的方法,除了这个。我从来没有想过会是这样。现在我会尝试一下。编辑 - 尝试了一下,它起作用了!!那个语法!!我有点讨厌它。但也许以后我会喜欢它。xD 哎呀! - raddevus
你定义了一个名为 doMath 的函数,它接受一个闭包作为第一个参数,以及两个整数作为第二和第三个参数。 - Martin R
@MartinR 噢,这是我定义另一个方法的方式。都是因为我正在学习Swift并尝试创建示例。好的,请将这两个东西写成答案,我很乐意标记为答案。同时,我会回去重新阅读Neuberg的解释。 - raddevus
1个回答

6

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) }

谢谢,这让我到达了我需要去的地方,并给了我额外的非常有价值的信息,使我能够更清晰地理解其他概念。 - raddevus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接