swift - 尾随闭包中的隐式参数
问题描述
我对 Swift 有点陌生。不是一个完全的初学者。
有没有办法将闭包作为参数传递而不显式填写该闭包的参数列表?
从这里尝试这段代码:
func addition(num1: Double, num2: Double) -> Double {
return num1 + num2
}
func multiply(num1: Double, num2: Double) -> Double {
return num1 * num2
}
func doMathOperation(operation:( _ x:Double, _ y:Double) -> Double, num1: Double, num2: Double) -> Double {
return operation(num1, num2)
}
doMathOperation(operation: multiply, num1: 4, num2: 5) //20
doMathOperation(operation: addition, num1: 4, num2: 5) //9
所以我想我会重写它以使其更易于阅读:
func addition (_ num1: Double, _ num2: Double)->Double {
return num1 + num2
}
func multiply (_ num1: Double, _ num2: Double)->Double {
return num1 * num2
}
func doMathOperation(_ num1: Double, _ num2: Double, operation: (_ x:Double,_ y:Double)->Double) ->Double {
return operation(num1, num2)
}
有趣的是,这有效:
doMathOperation(4, 5, operation: multiply) //20
但这不会:
doMathOperation(4, 5) {multiply} //error: contextual type for closure argument list expects 2 arguments, which cannot be implicitly ignored
据我所知,它们的含义应该完全相同,但是当我使用尾随闭包语法时,编译器不会让我编译它。
解决方案
在
doMathOperation(4, 5, operation: multiply)
...您被要求提供一个带有两个 Double 参数的函数,并且multiply
是这样一个函数的名称,因此它可以编译和工作。
在
doMathOperation(4, 5) { ... }
花括号本身是带有两个 Double 参数的(函数体)。将另一个此类函数的名称放在花括号内是没有意义的。
当然,你可以随意调用任何你喜欢的函数,传递传递给你的参数;因此这有效:
doMathOperation(4, 5) { multiply($0,$1) }
所以,总结一下:在第一个
doMathOperation(4, 5, operation: multiply)
有一个函数 ,multiply
和 4 和 5 被传递给它。在第二个
doMathOperation(4, 5) { multiply($0,$1) }
有两个函数,“匿名”(花括号)和multiply
,并且 4 和 5 被传递给第一个函数,然后它调用第二个函数。
推荐阅读
- c# - 如何使用来自相机的 Raycast 获得可追踪命中
- javascript - 更新到 Angular 7 后出错。'string | 类型的参数 ArrayBuffer' 不可分配给“字符串”类型的参数
- regex - 正则表达式提取单词之前/之后的数字
- azure-ad-b2c - Azure B2C:“提供的 id_token 签名验证失败”
- ssl - 在 Helm 和 Tiller 之间设置 SSL
- python-3.x - 致命错误:C1083 无法打开包含文件“zlib.h”
- python - 无法从运行在 data proc 集群上的 jupyter notebook 读取谷歌云存储桶中的文件
- python - Tkinter - 返回选定树视图的列号
- php - WordPress 数据库错误:[列计数与第 1 行的值计数不匹配]
- c - 子进程内存分配和收获子进程的目的