2017-10-11 3 views
3

次の関数では、htmlタグの属性に属性を渡します。これらの属性は、文字列(test("id", "123"))または機能(test("onclick", {_ -> window.alert("Hi!")}))とすることができる:Kotlinでは、文字列または関数である関数パラメータをどのように宣言できますか?

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

Iは、Anyとしてパラメータvalueを宣言するKotlinのルートタイプを試してみました。しかし、関数はタイプAnyではありません。タイプをdynamicと指定したが、

  • dynamicはタイプではありません。パラメータの型チェックをオフにするだけです。
  • dynamicはkotlin-js(Javascript)でのみ動作します。

この機能は、Kotlin(Java)でどのように記述できますか?関数型はAnyとどのように関連していますか?関数型とAnyの両方を含む型はありますか?

答えて

6

あなただけの機能をオーバーロードすることができます:

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

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

がありません両方の型の変数を作成する方法は? 'var x:dynamic'のように' x'は文字列か関数か? 'x =" foo "; x = {print(...)} ' – dilvan

2

あなたが書くことができます:

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

をし、次の方法で関数を呼び出す:

test("attr") 
test("attr", "hello") 
test("attr", lambda = { println("hello") }) 
test("attr") { println("hello") } 
test("attr", "hello", { println("hello") }) 
test("attr", "hello") { println("hello") } 
関連する問題