Null許容型をunwrapしたい
Null許容型をnon-nullableな型のメソッドの引数にわたすとき困ることがある。
fun f(foo: Foo) { … }
var foo: Foo? = …
fun g() {
f(foo) // コンパイルエラー
}
メソッドf
の引数はNull許容型ではないので、Foo?
型の変数を引数に書くとコンパイルエラーとなる。
if文でnullチェックしつつ早期リターン
メソッド外部で変更されない変数であれば、if
文でnull
チェックすると文脈から推論されてunwrapされる。
fun f(foo: Foo) { … }
var foo: Foo? = …
fun g() {
if (foo == null) {
return …
}
// foo が null のときはここには来ないのでここでは foo は Foo と推論される
f(foo) // コンパイルエラーにならない
}
elvis演算子を利用した早期リターン
elvis演算子を使ってval 新しい変数 = 変数 ?: return
とすると変数がnull
の場合は
return
されるので、新しい変数に入る値はnull
ではない。
そのため新しい変数の型はunwrapされてNull許容型ではななくなる。
fun f(foo: Foo) { … }
var foo: Foo? = …
fun g() {
// foo が null なら return. null でないなら新たに foo に代入→新たなfooの型はFoo
val foo = foo ?: return …
f(foo) // コンパイルエラーにならない
}
elvis演算子を利用してデフォルト値を設定
elvis演算子を使ってnull
ならデフォルト値を入れるようにしておけばNull許容型ではなくなる。
fun f(foo: Foo) { … }
var foo: Foo? = …
fun g() {
// foo が null ならデフォルト値を入れておく
val foo = foo ?: Foo()
f(foo) // コンパイルエラーにならない
}
?.
演算子+スコープ関数
?.
演算子でnull安全にスコープ関数を呼び出すと、スコープ関数に渡した無名関数の引数がNull許容型ではなくなる。
fun f(foo: Foo) { … }
var foo: Foo? = …
fun g() {
// foo が null なら return. null でないなら新たに foo に代入→新たなfooの型はFoo
foo?.let { foo ->
// 無名関数の引数fooの型はFoo
f(foo) // コンパイルエラーにならない
}
}
\確かな知識を身に着けたい、Androidアプリ開発を学びたい人にオススメ!/