在 Kotlin 中将 lambda 存储在变量中

23

我开始使用 Kotlin 开发 Android 应用,但是在使用 lambda 表达式时遇到了问题。我有一个函数用于在视图中设置监听器,代码如下:

fun setListener(listener: () -> Unit) {
}
问题在于作为lambda传递的代码不会在setListener函数中执行,而是在我的代码的另一个部分执行(具体来说,当选择spinner的项目时)。因此,我必须将此lambda“保存”或“存储”到变量/属性中,以便在需要时能够执行它。有任何想法如何做到这一点吗?
编辑:我通过以下方式实现了它:
private var listener: (() -> Unit)? = null

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

有更好的方法吗?谢谢

3个回答

23

以下是您可以实现它的方式:

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

然而,在 Kotlin 中,手动编写 setter 不被鼓励。相反,您可以将属性设置为公共的:

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

供参考,这里是有许多示例的有关属性的文档


"Getter的可见性必须与属性的可见性相同"(即您不能在private get中使用public set)。我建议使用var listener: () -> Unit = {} - mfulton26

14

你可以很容易地将一个函数存储在属性中。最简单的方法:

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()
    }
}

使用这段代码时,即使在我的类内部尝试使用_listener,我仍然会遇到错误。 - aloj
@aloj 我已经补充并澄清了我的答案。如果你仍然遇到错误,请发布错误信息。 - Miha_x64
你可以使用 private get() = ... 将 getter 设为私有。这样,你甚至不需要 _listener 属性。 - diesieben07
@diesieben07,您不能将setter的可见性设置为低于getter的可见性。 - Miha_x64

1
这是一个简单的例子。
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;
}

1
这个答案应该被标记为正确的解决方案:=::是关键。 - Dugh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接