1
0

More than 1 year has passed since last update.

【Kotlin】スコープ関数まとめ

Posted at

はじめに

最近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を書くときにこんがらがりそうなので使わない派です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0