在kotlin中传递函数作为参数

Sai*_*Sai 11 kotlin

我正在尝试将函数作为参数传递,但它抛出'Unit不能作为函数调用.提前致谢.

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'
} 
Run Code Online (Sandbox Code Playgroud)

Jan*_*son 25

问题是,您没有将函数作为参数传递给uploadImageToParse方法.你传递的结果.此外,uploadImageToParse方法期望safeCall单位参数而不是函数.

为此,您必须首先声明uploadImageToParse期望一个函数参数.

fun uploadImageToParse(file: String?, saveCall: () -> Unit) {
    saveCall()
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以将函数参数传递给此方法.

uploadImageToParse(imageFile, {saveCall()})
Run Code Online (Sandbox Code Playgroud)

有关该主题的更多信息,请参阅Kotlin文档中的高阶函数和Lambdas.

编辑:正如@marstran所指出的,您还可以使用函数参考将该函数作为参数传递.

uploadImageToParse(imageFile, ::saveCall)
Run Code Online (Sandbox Code Playgroud)

  • `{saveCall()}`可以写成`:: saveCall`. (10认同)
  • 您将如何使用带有参数的函数? (2认同)

小智 8

接受函数指针作为参数是这样完成的:

private fun uploadImageToParse(file: ParseFile?, saveCall: () -> Unit){
    saveCall.invoke()
}
Run Code Online (Sandbox Code Playgroud)

()参数的类型。

-> Unit部分是返回类型。

第二个例子:

fun someFunction (a:Int, b:Float) : Double {
    return (a * b).toDouble()
}

fun useFunction (func: (Int, Float) -> Double) {
    println(func.invoke(10, 5.54421))
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅Kotlin 文档