我开始使用kotlin在Android上开发,我有一个lambda问题。我有一个在我的视图中设置监听器的功能,如下所示:
fun setListener(listener: () -> Unit) {
}
问题是作为lambda传递的代码不会在setListener函数中执行,它将在我的代码的另一部分执行(特别是当选择了一个微调器的项目时)所以我必须“保存”或将此lambda“存储”到变量/属性中,以便我能够在需要时执行它。有关如何做到这一点的想法吗?
编辑:我通过以下方式实现了目标:
private var listener: (() -> Unit)? = null
fun setListener(listener: () -> Unit) {
this.listener = listener
}
有更好的方法吗?感谢
答案 0 :(得分:17)
以下是您可以这样做的方法:
class Foo {
private var listener: () -> Unit = {}
fun setListener(listener: () -> Unit) {
this.listener = listener
}
}
然而,在Kotlin中不鼓励手动编写setter。相反,您可以公开您的财产:
class Foo {
var listener: () -> Unit = {}
}
供参考,以下是docs about properties,其中包含大量示例。
答案 1 :(得分:8)
您可以轻松地将功能存储在属性中。最简单的方法:
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()
}
}
答案 2 :(得分:0)
这是一个简单的例子。
fun main(){
val result=::sum //function assign to variable (first method)
val result1: (first: Int, second: Int) -> Int=::sum //function assign to variable (second method)
print(result(5,6))
}
fun sum(first:Int,second:Int):Int{
return first+second;
}