イベントを別関数で記述したい人向け。
C#などから移行してくると、kotlinのイベントハンドラーの設定が逆方向のように感じられて違和感があると思う。その場合には、関数の参照について少し学習してみるといいかもしれない。
kotlinでは関数やクラスメソッド、プロパティも変数に入れることができる。これを利用すればC#のdelegateに近い実装をすることができる。
よくあるパターンの書き方だと、例えばView.setOnClickListenerにずらずらと処理を書くことになるため、それをクラスメソッドにしたいということがあると思うが、それもこのような関数の参照を利用すれば記述することができる。
C#などから移行してくると、kotlinのイベントハンドラーの設定が逆方向のように感じられて違和感があると思う。その場合には、関数の参照について少し学習してみるといいかもしれない。
kotlinでは関数やクラスメソッド、プロパティも変数に入れることができる。これを利用すればC#のdelegateに近い実装をすることができる。
よくあるパターンの書き方だと、例えばView.setOnClickListenerにずらずらと処理を書くことになるため、それをクラスメソッドにしたいということがあると思うが、それもこのような関数の参照を利用すれば記述することができる。
//お試しの関数宣言
fun testFun01(num: Int): String = num.toString()
//すでに宣言してある関数の参照を変数に入れることができる
val test01: (Int) -> String = ::testFun01
//関数の呼び出しはこのように行う
println(test01.invoke(22))
//invokeを省略して通常の関数のように行うこともできる
println(test01(22))
//無名関数により関数を変数に入れることができる
val test02: (Int) -> String = fun (num:Int): String = num.toString()
println(test01(99))
//クラスのメソッドも参照することができる
class TestClass01 {
fun test01(num: Int): String = num.toString()
}
val testClass01 = TestClass01()
val test03: (Int) -> String = testClass01::test01
println(test03(44))
//クラスのプロパティも参照することができる
class TestClass02 {
var test01: Int = 222
}
val testClass02 = TestClass02()
val test04 = testClass02::test01
println(test04())
//クリックイベントを別の関数で処理させるため、関数を変数にいれるという方法ができる
button.setOnClickListener(onClick01)
//無名関数で変数に参照をいれておき、それをsetOnClickListenerに入れる
val onClick01 = fun(view: View) {
Log.v("nullpo","ぬるぽ")
}
//もう一つの方法は関数の参照を入れる方法が利用できる
//関数を変数に入れるのに違和感がある場合は関数の参照を利用するとわかりやすい
//ハンドラーの関数への参照をsetOnClickListenerに入れる
button.setOnClickListener(::onClick02)
//イベント用のハンドラーを宣言しておく
fun onClick02(view: View) {
Log.v("nullpo","ぬるぽ")
}