2017-05-05 34 views
2

我開始使用kotlin在Android中開發,並且對lambda表達式有問題。我有一個函數來設置一個聽衆在我看來,這看起來是這樣的:將lambda存儲在kotlin中的一個變量中

fun setListener(listener:() -> Unit) { 
} 

的問題是,作爲拉姆達傳遞的代碼將無法在setListener功能被執行,將在另一部分執行我的代碼(特別是當一個微調項被選中時),所以我必須將這個lambda「保存」或「保存」到一個變量/屬性中,以便我能夠在需要時執行它。有關如何去做的任何想法?

編輯:

private var listener: (() -> Unit)? = null 

fun setListener(listener:() -> Unit) { 
    this.listener = listener 
} 

有沒有更好的方式來做到這一點:我已經做實現呢?由於

回答

6

這裏是你如何能做到這一點:

class Foo { 
    private var listener:() -> Unit = {} 
    fun setListener(listener:() -> Unit) { 
     this.listener = listener 
    } 
} 

然而,手工編寫制定者在科特林氣餒。相反,你可以公開你的財產:

class Foo { 
    var listener:() -> Unit = {} 
} 

作爲參考,這裏是docs about properties有很多的例子。

+0

「獲取器的可見性必須與屬性可見性相同(即,您不能使用'private get'獲取'public set'')。我建議'var listener:() - > Unit = {}'。 – mfulton26

3

您可以輕鬆地將屬性存儲在屬性中。最簡單的方法:

var listener: (() -> Unit)? = null 

用法:

foo.listener = { println("called") } 

如果你希望你的屬性設置止,您可以創建無法使用getter和一個私有財產供內部使用一個公共財產。完整示例:

class Example { 

    // for internal use 
    private var _listener: (() -> Unit)? = null 

    // public set-only 
    var listener: (() -> Unit)? 
     @Deprecated(message = "set-only", level = DeprecationLevel.ERROR) 
     get() = throw AssertionError() // unusable getter 
     set(value) { _listener = value } // write-through setter 

    fun somethingHappend() { 
     _listener?.invoke() 
    } 
} 
+0

有了這段代碼,當我嘗試在我的課堂中使用_listener時,我也遇到了一個錯誤。 – aloj

+0

@aloj我已經闡述並澄清了我的答案。如果仍然出現錯誤,請發佈錯誤消息。 –

+0

你可以用'private get()= ...'使getter私有。那麼你甚至不需要'_listener'屬性。 – diesieben07

相關問題