在下面的代码中,如果 trips 为空,我想显示我的空视图,然后返回并避免运行下面的代码,但编译器说“此处不允许返回”。
mainRepo.fetchUpcomingTrips { trips ->
if (trips.isEmpty()) {
showEmptyViews()
return
}
// run some code if it's not empty
}
有办法这样返回吗?
我知道我可以把它放在 if else 块中,但我讨厌写 if else,在我看来,当有更多条件时,它不太容易理解/可读。
只需使用限定返回语法:
return@fetchUpcomingTrips
。
在 Kotlin 中, lambda 内的
return
表示从最内层嵌套 fun
返回(忽略 lambda),并且在非内联的 lambda 中不允许这样做。
return@label
语法用于指定返回的范围。您可以使用 lambda 传递给的函数名称 (
fetchUpcomingTrips
) 作为标签:
mainRepo.fetchUpcomingTrips { trips ->
if (trips.isEmpty()) {
showEmptyViews()
return@fetchUpcomingTrips
}
// ...
}
相关:
return
建议您从函数返回。由于您无法从 lambda 内的函数返回,因此编译器会抱怨。相反,您想从 lambda 返回,并且必须使用标签:
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 终止最近的封闭循环。
继续 继续执行最近的封闭循环的下一步。
更多详情请参阅return
的替代方案可能是
mainRepo.fetchUpcomingTrips { trips ->
if (trips.isEmpty())
showEmptyViews()
else {
//run some code if it's not empty
}
}
bleManager.onWriteValueStatus = onWriteValueStatus@{ bleWriteInfo ->
if (bleWriteInfo.characteristic != CharacteristicUUID.RPC.value) {
return@onWriteValueStatus
}
}