在 Kotlin 中将函数作为参数传递

24

我正在尝试将一个函数作为参数传递,但它会抛出“Unit cannot be invoked as function”的错误提示。提前感谢您的帮助。

uploadImageToParse(imageFile, saveCall1())
uploadImageToParse(imageFile, saveCall2())
uploadImageToParse(imageFile, saveCall3())

private fun uploadImageToParse(file: ParseFile?, saveCall: Unit) {
        saveCall()//Throws an error saying 'Unit cannot be invoked as function'
} 
4个回答

49

问题在于,您没有将一个函数作为参数传递给uploadImageToParse 方法。 您正在传递结果。 另外,uploadImageToParse 方法期望 safeCallUnit 参数而不是 function

为了使其起作用,您首先必须声明uploadImageToParse以期望函数参数。

fun uploadImageToParse(file: String?, saveCall: () -> Unit) {
    saveCall()
}

那么您可以将函数参数传递给这个方法。

uploadImageToParse(imageFile, {saveCall()})

了解更多相关主题,请查看 Kotlin 文档中的 Higher-Order Functions and Lambdas

编辑: 如 @marstran 指出,您还可以使用 函数引用 将函数作为参数传递。

uploadImageToParse(imageFile, ::saveCall)

17
{saveCall()} 可以写成 ::saveCall - marstran
2
你如何使用带参数的函数? - Bryan Bryce
1
基本上相同,只是不需要空参数列表,而是指定它应该接受哪些参数。例如:myFunction: (path: Path) -> Unit。请查看文档中的此示例。https://kotlinlang.org/docs/reference/lambdas.html#function-types - Januson

8
接受函数指针作为参数的方法如下:
private fun uploadImageToParse(file: ParseFile?, saveCall: () -> Unit){
    saveCall.invoke()
}

第一段:括号中的内容是参数类型。
第二段:箭头后面的“Unit”是返回类型。
第三段:第二个例子:
fun someFunction (a:Int, b:Float) : Double {
    return (a * b).toDouble()
}

fun useFunction (func: (Int, Float) -> Double) {
    println(func.invoke(10, 5.54421))
}

更多信息,请参考Kotlin文档

2

使用lambda表达式,我们可以将方法作为参数传递。
例如:

fun main(args: Array<String>) {
  MyFunction("F KRITTY", { x:Int, y:Int -> x + y })
}

fun MyFunction(name: String , addNumber: (Int , Int) -> Int) {
  println("Parameter 1 Name :" + name)
  val number: Int = addNumber(10,20)
  println("Parameter 2 Add Numbers : " + number)
}

0
以上的答案都是正确的。我也看到有关带参数情况的问题。在这种情况下,您可以使用以下方法:
例如,如果接受函数类似于下面的函数:
fun uploadImageToParse(file: String?, saveCallParameter: (a:String,b:Int,c:String) -> Unit) {
saveCall(x,y,z) }

那么你可以这样编写你的调用:

uploadImageToParse(saveCallParameter={a,b,c->saveCall(a,b,c)}

这里的 named parameter 是 saveCall。


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