2017-07-27 98 views
5

在下面的代码中,我想显示我的空视图,如果旅行是空的,然后返回并避免运行下面的代码,但编译器说“返回不允许在这里”。在lambda中使用return?

mainRepo.fetchUpcomingTrips { trips -> 
    if (trips.isEmpty()) { 
     showEmptyViews() 
     return 
    } 

    // run some code if it's not empty 
} 

有没有办法像那样返回?

我知道我可以把它放在一个if else块中,但是我讨厌写作,如果有其他东西,在我看来只有更多的条件时,这是不太可理解/可读的。

回答

14

只需使用限定的返回语法:[email protected]

在Kotlin中,return里面的lambda表示从最内层嵌套fun(忽略lambda表示)返回,并且不允许在不是inlined的lambdas中。

[email protected]语法用于指定要从中返回的范围。您可以使用拉姆达传递给(fetchUpcomingTrips)功能作为标签的名称:

mainRepo.fetchUpcomingTrips { trips -> 
    if (trips.isEmpty()) { 
     showEmptyViews() 
     [email protected] 
    } 

    // ... 
} 

相关:

3

Plain return表示你从函数返回。既然你不能从lambda函数中返回,编译器会抱怨。相反,你想从拉姆达回来,你必须使用一个标签:

mainRepo.fetchUpcomingTrips { trips -> 
      if (trips.isEmpty()) { 
       showEmptyViews() 
       [email protected] 
      } 

      //run some code if it's not empty 
     } 
1

的回报让我们从外部函数返回。最重要的用例是从lambda表达式返回

匿名函数中的返回语句将从匿名函数本身返回。

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) 
}) 
} 

当返回一个值,该解析器优先选择合格的返回,即

[email protected] 1 

是指“在标签@a返回1”而不是“返回一个标记的表达(@a 1) ”。 返回默认情况下从最近的封闭函数或匿名函数返回。

中断终止最近的封闭循环。

继续进行到最近的封闭循环的下一步。

更多详情,请参阅Returns and Jumps,Break and Continue Labels

0

return另一种可能是

mainRepo.fetchUpcomingTrips { trips -> 
      if (trips.isEmpty()) 
       showEmptyViews() 
      else { 
       //run some code if it's not empty 
      } 
     }