はじめに
真面目にAndroidアプリを作ろうと決意したので、学習したことの備忘録として書いてます。
下記のサイトを参考にさせてもらいました。
https://qiita.com/ngsw_taro/items/d29e3080d9fc8a38691e
スコープ関数とは
引数にとる関数のスコープを変更するための関数。(クロージャと同じ?)
基本的には、複数処理をまとめたい場合に使用する。
let
定義
public inline fun <T, R> T.let(f: (T) -> R): R = f(this)
特徴
- 拡張関数であるため、自分自身をゴニョゴニョするときに使う
- Nullableな値に使用すると、nullの場合はnullを返し、nullでない場合は関数の実行結果を返す。
使用例
nullableな値をすべて大文字にし、逆にする。
val hoge: String? = "hoge"
val result = hoge?.let {
it.toUpperCase()
it.reversed()
}
with
定義
public inline fun<T, R> with(receiver: T, f: T.() -> R):R = receiver.f()
特徴
- 拡張関数ではなく、ただの関数
- 最後の実行式を返す
使用例
ユーザークラスのnameとageのプロパティに値を設定する
val user = with(User(), {
name = "taro"
age = 20
this
})
上記のようにオブジェクトに値を設定したい場合は、後述するapplyを使うほうが適しているかもしれない。
run
定義
public inline fun<T, R> T.run(f: T.() -> R):R = f()
特徴
- 拡張関数
- 実行結果を返す
- letとwithを合体させた感じ
使用例
val user = User().run {
name = "taro"
age = 20
}
apply
定義
public inline fun<T> T.apply(f: T.() -> Unit): T { f(); return this }
特徴
- レシーバーを返す。
- レシーバーのオブジェクトに対して何かを設定したりするときに使用する。
- レシーバーのオブジェクトに対して、関数の実行結果を返すわけではないので何も起こらない。
使用例
ユーザークラスのnameとageのプロパティに値を設定する。
val user = User().apply {
name = "taro"
age = 20
}
オブジェクトに対して何かを設定するときに使用する。
最後に
自分でも完全に理解できていないので随時更新していきます。