2017-01-27 3 views
4

Ich versuche, eine Funktion als Parameter übergeben, aber es wirft 'Einheit kann nicht als Funktion aufgerufen werden. Danke im Voraus.Übergeben Funktion als Parameter in Kotlin

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' 
} 

Antwort

10

Problem ist, dass Sie nicht eine Funktion als Parameter an die uploadImageToParse Methode übergeben. Sie übergeben das Ergebnis. Auch uploadImageToParse Methode erwartet safeCall zu Einheit Parameter keine Funktion.

Damit dies funktioniert, müssen Sie zuerst uploadImageToParse erklären, um einen Funktionsparameter zu erwarten.

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

Dann können Sie Funktionsparameter an diese Methode übergeben.

uploadImageToParse(imageFile, {saveCall()}) 

Weitere Informationen zum Thema finden Sie aktuelle Higher-Order Functions and Lambdas in der Kotlin Dokumentation.

Bearbeiten: Wie @marstran darauf hingewiesen, können Sie auch die Funktion als Parameter übergeben mit Function Reference.

uploadImageToParse(imageFile, ::saveCall) 
+8

'{Savecall()}' 'kann geschrieben werden :: saveCall'. – marstran

+0

Wie würden Sie eine Funktion mit Argumenten verwenden? –

+0

Grundlegend das gleiche, nur dass anstelle von leerer Arg Liste angegeben wird, welche Argumente es nehmen soll. Z.B. myFunction: (Pfad: Pfad) -> Einheit. Sehen Sie sich dieses Beispiel in der Dokumentation an. https://kotlinlang.org/docs/reference/lambdas.html#function-types – Januson

3

Akzeptieren einer Funktionszeiger als ein Parameter, wie dies durchgeführt wird:

private fun uploadImageToParse(file: ParseFile?, saveCall:() -> Unit){ 
    saveCall.invoke() 
} 

Die () sind die Arten der Parameter.

Der -> Unit Teil ist der Rückgabetyp.

Zweites Beispiel:

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

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

Weitere Informationen finden Sie in der Kotlin Documentation

Verwandte Themen