在kotlin中传递函数作为参数

时间:2017-01-27 05:40:01

标签: 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'
} 

4 个答案:

答案 0 :(得分:21)

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

为此,您必须首先声明uploadImageToParse以期望函数参数。

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

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

uploadImageToParse(imageFile, {saveCall()})

有关该主题的更多信息,请参阅Kotlin文档中的Higher-Order Functions and Lambdas

编辑:正如@marstran指出的那样,您也可以使用Function Reference将该函数作为参数传递。

uploadImageToParse(imageFile, ::saveCall)

答案 1 :(得分:3)

将函数指针作为参数接受如下:

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 Documentation

答案 2 :(得分:1)

使用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)
}

答案 3 :(得分: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)}

saveCall是命名参数。