尾随闭包中的隐式参数

Implicit parameters in trailing closure

我对 Swift 有点陌生。不完全是初学者。

有没有办法在不显式填写闭包参数列表的情况下将闭包作为参数传递?

正在尝试来自 here 的代码:

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([=12=],) }

所以,总结一下:在第一个

doMathOperation(4, 5, operation: multiply)

有一个函数,multiply,传递给它的是 4 和 5。第二个

doMathOperation(4, 5) { multiply([=12=],) }

有两个函数,“anonymous”(花括号)和 multiply,4 和 5 被传递给第一个,然后它调用第二个。