web-dev-qa-db-ja.com

Kotlinの変数にラムダを格納する

Android=で開発を開始していて、ラムダに問題があります。ビューにリスナーを設定する関数があります。これは次のようになります:

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

問題は、ラムダとして渡されたコードがsetListener関数で実行されず、コードの別の部分で実行されるため(具体的には、スピナーのアイテムが選択されている場合)、「保存」または「保存」する必要があることです。このラムダを変数/プロパティに入れて、必要なときに実行できるようにします。それを行う方法について何か考えはありますか?

編集:私はそれを達成しました:

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

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

それを行うより良い方法はありますか?ありがとう

13
aloj

方法は次のとおりです。

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

ただし、Kotlinでは手動でセッターを作成することはお勧めしません。代わりに、プロパティをパブリックにすることができます。

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

参考までに、ここに プロパティに関するドキュメント と多くの例を示します。

18

プロパティに関数を簡単に格納できます。最も簡単な方法:

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

使用法:

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

プロパティを設定のみにする場合は、使用できないgetterを含む1つのパブリックプロパティと、内部で使用する1つのプライベートプロパティを作成できます。完全な例:

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