2017-07-27 21 views
5

Aşağıdaki kodda, geziler boşsa boş görünümlerimi göstermek istiyorum ve ardından aşağıdaki kodu çalıştırıp geri döndürmekten kaçınmak istiyorum, ancak derleyici "geri dönüşe burada izin verilmiyor" diyor.Bir lambda içinde dönüşü kullanarak?

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

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

Böyle geri dönmenin bir yolu var mı?

Biliyorum, eğer bir başka bloğa koyabilirim ama yazıyorsa nefret ediyorum, bir kaç tane daha fazla koşul olduğunda bence daha az anlaşılabilir/okunabilir.

cevap

14

Yalnızca nitelikli iade sözdizimini kullanın: [email protected]. Bir lambda içinde KOTLIN olarak

, return içteki yuva fun (gözardı lambdas) dönüşü anlamına gelir ve inlined olmayan lambdas izin verilmez.

[email protected] sözdizimi, döndürülen kapsamı belirtmek için kullanılır.

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

    // ... 
} 

Related:

3

Düz return, işlevden döndüğünüzü önerir. Bir lambda içindeki işlevden dönemeyeceğiniz için derleyici şikayet edecektir. Bunun yerine, lambda dönmek istiyor ve bir etiket kullanmak zorunda:

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

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

döner bize bir dış işlevinden dönmek için izin verir. En önemli kullanım durumu, bir lambda ifadesinden dönen bir

Anonim bir işlevin bir dönüş ifadesi, anonim işlevin kendisinden dönecektir.

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

bir değer iade, ayrıştırıcı

[email protected] 1 

anlamına

etiketlenmiş bir ifade dönüş" "etiketi @a de 1 dönüş" olup, yani kalifiye geri tercih verir (@a 1) ". Dönüş Varsayılan olarak, en yakın kapatma işlevinden veya anonim işlevinden döner.

Ara Kopukluk En yakın çevreleme döngüsünü sonlandırır.

Devam En yakın çevreleme döngüsünün sonraki adımına ilerler.

fazla detay Returns and Jumps,Break and Continue Labels

0

başvurmak return bir alternatif olabilir

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