2017-05-05 9 views
2

私はkotlinでAndroidで開発を始めています。ラムダに問題があります。 I私の見解では、リスナーを設定する機能を持っている、これは次のようになります。問題は、ラムダとして渡されたコードはsetListener機能で実行されないことであるkotlinの変数にラムダを保存

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

、それは別の部分で実行されます私のコード(特にスピナーの項目が選択されている場合)は、このラムダを変数/プロパティに "保存"または "保存"して、必要なときに実行できるようにしなければなりません。どのようにそれを行うかについての任意のアイデア?

編集:私はやってそれを達成した:

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

ただし、手動でセッターを書くことKotlinに落胆しています。代わりに、あなたの財産を公開することができます:

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

参考のために、ここには多くの例があります。docs about properties

+0

"Getterの可視性はプロパティの可視性と同じでなければなりません"(つまり、 'private get'で' public set'を使うことはできません)。私は 'var listener:() - > Unit = {}'を提案します。 – mfulton26

3

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

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

は使用方法:

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

あなたはあなたの財産は、専用設定したい場合は、あなたが使用できなくゲッター、内部使用のための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() 
    } 
} 
+0

このコードでは、私のクラス内で_listenerを使用しようとするとエラーが発生します – aloj

+0

@aloj私はaugumented&私の答えを明確にしました。まだエラーが発生している場合は、エラーメッセージを投稿してください。 –

+0

ゲッターを 'private get()= ...'でプライベートにすることができます。次に、 '_listener'プロパティも必要ありません。 – diesieben07

関連する問題