2017-10-11 41 views
3

在下面的函數中,我想傳遞一個html標籤的屬性。這些屬性可以是字符串(test("id", "123"))或功能(test("onclick", {_ -> window.alert("Hi!")})):如何在Kotlin中聲明可以是字符串或函數的函數參數?

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

我試圖聲明參數valueAny,在科特林根類型。但函數不是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") }