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

标签 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 时,它打印:

doing Math

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

8

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

我尝试过的

  • 我正在看书,iOS 12 Programming Fundamentals with Swift by Matt Neuberg但他没有解释带参数的匿名方法。
  • 我已经用 google 和 SOed 搜索了,但找不到一个我能快速理解的例子。
  • 我尝试了很多变体,以下是我最接近的变体,但我收到如下所示的错误:

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

我收到一条错误消息:

error msg

最佳答案

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

关于swift - 如何创建一个内联匿名函数,以便在函数调用中立即使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53399886/

相关文章:

ios - 如何使用 Swift 3 在 iOS 9 中设计表单布局

javascript - 在 JavaScript 中评估相等性或同一性时,操作数顺序有什么不同吗?

sql - 如何将架构作为参数传递给sql server中的存储过程?

c++ - 欧几里得算法函数参数

Swift 3 并行 for/map 循环

ios - 没有 Storyboard和segue的快速委托(delegate)问题

swift - 我应该更喜欢运算符重载而不是函数/方法吗?

python - 对象旁边的方括号 - 表示法叫什么?

php - 更有效地验证 PHP 文件的语法

c# - 在 C# 中使用十进制值作为属性参数?