以下のコードでは、tripsが空の場合は空のビューを表示してから戻り、以下のコードの実行を避けたいのですが、コンパイラは「ここではreturnは許可されていません」と言っています。
mainRepo.fetchUpcomingTrips { trips ->
if (trips.isEmpty()) {
showEmptyViews()
return
}
// run some code if it's not empty
}
そのように戻る方法はありますか?
私はif elseブロックにそれを置くことができることを知っていますが、他の場合は書くのが嫌いです、それはいくつかの条件がある場合、私の意見ではあまり理解できない/読みにくいです。
修飾された戻り構文を使用するだけです:return@fetchUpcomingTrips
。
Kotlinでは、ラムダ内のreturn
は、最も内側のfun
からの戻り(ラムダを無視)を意味し、 インライン ではないラムダでは許可されません。
return@label
構文を使用して、返すスコープを指定します。ラムダが(fetchUpcomingTrips
)に渡される関数の名前をラベルとして使用できます。
mainRepo.fetchUpcomingTrips { trips ->
if (trips.isEmpty()) {
showEmptyViews()
return@fetchUpcomingTrips
}
// ...
}
関連:
ラベルで戻る 言語リファレンス
プレーンreturn
は、関数から戻ることを提案します。ラムダ内の関数から戻ることができないため、コンパイラーは文句を言います。代わりに、ラムダから戻りたいので、ラベルを使用する必要があります。
mainRepo.fetchUpcomingTrips { trips ->
if (trips.isEmpty()) {
showEmptyViews()
return@fetchUpcomingTrips
}
//run some code if it's not empty
}
戻り値により、外部関数から戻ることができます。最も重要なユースケースは、ラムダ式からの戻りです
無名関数のreturnステートメントは、匿名関数自体から戻ります。
fun foo() {
ints.forEach(fun(value: Int) {
if (value == 0) return // local return to the caller of the anonymous fun, i.e. the forEach loop
print(value)
})
}
値を返すとき、パーサーは修飾された戻り値を優先します。
return@a 1
「ラベル付き式(@a 1)を返す」ではなく、「ラベル@aで1を返す」ことを意味します。 Returnデフォルトでは、最も近い包囲関数または無名関数から戻ります。
Break最も近い囲みループを終了します。
Continue最も近い包囲ループの次のステップに進みます。
詳細は リターンとジャンプ、ブレークと継続ラベル を参照してください
return
の代わりに
mainRepo.fetchUpcomingTrips { trips ->
if (trips.isEmpty())
showEmptyViews()
else {
//run some code if it's not empty
}
}