在下面的代码中,我想显示我的空视图,如果trip是空的然后返回并避免运行下面的代码,但编译器说“这里不允许返回”。
mainRepo.fetchUpcomingTrips { trips ->
if (trips.isEmpty()) {
showEmptyViews()
return
}
// run some code if it's not empty
}
有没有办法像这样回来?
我知道我可以把它放在一个if else块中,但是我讨厌写别的,如果有更多的条件,我认为它不太可理解/可读。
答案 0 :(得分:33)
只需使用限定的返回语法:return@fetchUpcomingTrips
。
在Kotlin中,lambda内的return
表示从最内层嵌套fun
(忽略lambdas)返回,并且不允许在不是inlined的lambdas中。
return@label
语法用于指定要返回的范围。您可以使用lambda传递给函数的函数名称(fetchUpcomingTrips
)作为标签:
mainRepo.fetchUpcomingTrips { trips ->
if (trips.isEmpty()) {
showEmptyViews()
return@fetchUpcomingTrips
}
// ...
}
相关:
答案 1 :(得分:4)
您还可以将{ trips ->
替换为fun(trips) {
来形成anonymous function,可以正常使用return
。
答案 2 :(得分:3)
普通return
建议您从函数返回。由于你无法从lambda中的函数返回,编译器会抱怨。相反,你想从lambda返回,你必须使用标签:
mainRepo.fetchUpcomingTrips { trips ->
if (trips.isEmpty()) {
showEmptyViews()
return@fetchUpcomingTrips
}
//run some code if it's not empty
}
答案 3 :(得分:1)
返回允许我们从外部函数返回。最重要的用例是从lambda表达式返回
匿名函数中的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)”。 返回默认情况下,从最近的封闭函数或匿名函数返回。
中断终止最近的封闭循环。
继续继续进行最近的封闭循环的下一步。
答案 4 :(得分:0)
return
的替代方案可能是
mainRepo.fetchUpcomingTrips { trips ->
if (trips.isEmpty())
showEmptyViews()
else {
//run some code if it's not empty
}
}