J'essaie de passer une fonction en tant que paramètre mais cela jette `` L'unité ne peut pas être invoquée en tant que fonction. Merci d'avance.

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'
} 
19
Sai 27 janv. 2017 à 08:40

4 réponses

Meilleure réponse

Le problème est que vous ne passez pas une fonction en tant que paramètre à la méthode uploadImageToParse. Vous passez le résultat. De plus, uploadImageToParse method s'attend à ce que safeCall soit un paramètre Unité et non une fonction .

Pour que cela fonctionne, vous devez d'abord déclarer uploadImageToParse pour attendre un paramètre de fonction.

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

Ensuite, vous pouvez passer des paramètres de fonction à cette méthode.

uploadImageToParse(imageFile, {saveCall()})

Pour plus d'informations sur le sujet, consultez Fonctions d'ordre supérieur et Lambdas dans Kotlin Documentation.

Edit: Comme @marstran l'a souligné, vous pouvez également passer la fonction en tant que paramètre en utilisant Function Référence.

uploadImageToParse(imageFile, ::saveCall)
33
Januson 27 janv. 2017 à 13:10

Accepter un pointeur de fonction comme paramètre se fait comme ceci:

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

Les () sont les types des paramètres.

La partie -> Unit est le type de retour.

Deuxième exemple:

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

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

Pour plus d'informations, reportez-vous à la Documentation Kotlin

4
Bryan Bryce 7 avril 2017 à 05:28

Les réponses ci-dessus sont correctes. J'ai également vu une question concernant les cas avec des paramètres. Dans ce cas, vous pouvez utiliser les éléments suivants:

Par exemple, si la fonction d'acceptation est comme celle ci-dessous:

fun uploadImageToParse(file: String?, saveCallParameter: (a:String,b:Int,c:String) -> Unit) {
saveCall(x,y,z) }

Ensuite, vous pouvez écrire votre appel comme ceci:

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

Ici, saveCall est le paramètre nommé.

0
Jude Osbert K 11 juin 2019 à 07:47

En utilisant l'expression lambda, nous pouvons passer la méthode en tant que paramètres
Exemple:

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)
}
1
Farid Haq 29 janv. 2019 à 08:47