2017-10-11 11 views
3

Dans la fonction suivante, je souhaite lui transmettre les attributs d'une balise html. Ces attributs peuvent être des chaînes (test("id", "123")) ou des fonctions (test("onclick", {_ -> window.alert("Hi!")})):Comment puis-je déclarer un paramètre de fonction qui peut être une chaîne ou une fonction, dans Kotlin?

fun test(attr:String, value:dynamic):Unit {...} 

j'ai essayé de déclarer le paramètre value comme Any, le type de racine dans Kotlin. Mais les fonctions ne sont pas de type Any. Déclarant le type dynamic travaillé, mais

  • dynamic n'est pas un type. Il désactive simplement la vérification du paramètre.
  • dynamic ne fonctionne que pour kotlin-js (Javascript). Comment est-ce que je peux écrire cette fonction dans Kotlin (Java)?

Comment écrire cette fonction dans Kotlin (Java)? Comment les types de fonctions se rapportent-ils à Any? Y at-il un type qui inclut les deux types de fonctions et Any?

Répondre

6

Vous pouvez simplement surcharger la fonction:

fun test(attr: String, value: String) = test(attr, { value }) 

fun test(attr: String, createValue:() -> String): Unit { 
    // do stuff 
} 
+0

est pas là une façon de créer une variable pour les deux types? Comme 'var x: dynamic' où' x' peut être une chaîne ou une fonction? 'x =" foo "; x = {imprimer (...)} – dilvan

2

Vous pouvez écrire:

fun test(attr: String, string: String? = null, lambda: (() -> Unit)? = null) { 
    if(string != null) { // do stuff with string } 
    if(lambda != null) { // do stuff with lambda } 
    // ... 
} 

Et puis appeler la fonction de la manière suivante:

test("attr") 
test("attr", "hello") 
test("attr", lambda = { println("hello") }) 
test("attr") { println("hello") } 
test("attr", "hello", { println("hello") }) 
test("attr", "hello") { println("hello") }