将lambda存储在kotlin的变量中
我正在用kotlin开始在Android上开发,并且在lambdas中遇到问题。 我有一个函数来设置一个监听器在我看来,这看起来像这样:
fun setListener(listener: () -> Unit) { }
问题是,作为lambda函数传递的代码将不会在setListener函数中执行,它将在我的代码的另一部分执行(特别是当一个微调项目被选中),所以我必须“保存”或“存储”这个lambda变成一个变量/属性,以便我能够在需要时执行它。 任何想法如何做到这一点?
编辑:我已经做到了:
private var listener: (() -> Unit)? = null fun setListener(listener: () -> Unit) { this.listener = listener }
有没有更好的方法来做到这一点? 谢谢
你可以这样做:
class Foo { private var listener: () -> Unit = {} fun setListener(listener: () -> Unit) { this.listener = listener } }
但是,Kotlin不鼓励手动编写setter。 相反,你可以公开你的财产:
class Foo { var listener: () -> Unit = {} }
作为参考,这里是有很多例子的属性的文档 。
你可以很容易的在一个属性中存储一个函数。 最简单的方法是:
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() } }