我正在尝试将函数作为参数传递,但它会抛出'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'
}
答案 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是命名参数。