首页 > 解决方案 > 尾随闭包中的隐式参数

问题描述

我对 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

据我所知,它们的含义应该完全相同,但是当我使用尾随闭包语法时,编译器不会让我编译它。

标签: swiftclosures

解决方案


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 被传递给第一个函数,然后它调用第二个函数。


推荐阅读