はじめに
最近Androidアプリを作りたくてKotlinを学習してます。基礎です。
今回はスコープ関数をまとめていきたいと思います。
スコープ関数
この関数は変数のスコープを変更する関数で、コードを簡略化、可読性の向上ができます。
使わなくても機能を実装することは可能です。
なくても困らないけどあれば便利ってやつですね。
with関数
同じオブジェクトに繰り返し処理を行う場合に有効です。
次のようなPersonクラスを用意します。
class Person(val name: String) {
var age: Int = 0
fun message(): String {
Log.d("message", "私は $name です。 $age 歳です。")
}
}
with関数を使わない呼び出し側はこのようになります。
val person = Person("REON")
person.age = 21
person.message() // 私は REON です。 21 歳です。
withを使うと少し簡単に書けます。
オブジェクトPerson("REON")
にwithのスコープ内でthisとしてアクセスでき、thisは省略できるので以下のようにスマートに書けます。
with(Person("REON")) {
age = 21
message() // 私は REON です。 21 歳です。
}
apply関数
オブジェクトを生成してそれぞれ値を設定するときに使います。
with関数と違うところは、戻り値がオブジェクトであるところです。
Person("REON").apply {
age = 22
}.message() // 私は REON です。 22 歳です。
戻り値がオブジェクトなので、メソッドチェーンとして記述できます。
let関数
安全呼び出し演算子「?.」と一緒に使うことが多いです。
with関数やapply関数と違い、オブジェクトはitで参照できます。
let関数を使わない場合
var name: String? = "reon"
var upperCaseName = name?.uppercase(Locale.getDefault())
var nameLength = name?.length
Log.d("message", "$upperCaseName $nameLength") // REON 4
let関数を使う場合
var name: String? = "reon"
var output = name?.let {
var upperCaseName = it.uppercase(Locale.getDefault())
var nameLength = it.length
"$upperCaseName $nameLength"
} ?: "null"
Log.d("message", output) // REON 4
run関数
run関数 = let関数 + with関数です。
先ほどのlet関数は以下のようにrun関数を使って書き換えられます。
with関数のようにthisでアクセスできるようになり、thisを省略できるのでこのように簡潔に記述できます。
var output = name?.run {
"${uppercase(Locale.getDefault())} $length"
} ?: "null"
Log.d("message", output)
also関数
オブジェクトへ処理を行う場合やオブジェクトへの参照が必要な場合に使用します。
オブジェクトはitで参照でき、戻り値はオブジェクトです。
val arrayInt = listOf(1, 2, 3).also {
Log.d("message", "$it") // [1, 2, 3]
}
おわりに
今回はスコープ関数を紹介しました。
ちなみに僕はSwiftを書くときにこんがらがりそうなので使わない派です。