2017-08-14 78 views
0

這是爲什麼抱怨失誤型? map應該transfor可觀察到其他的價值,但它希望我從地圖在Kotlin中使用RXJava地圖?

override fun fetchExercises(): Observable<List<Exercise>> { 
    return FirebaseDatabase.getInstance() 
     .getReference("exercises") 
     .observeSingleEvent() 
     .map { snapshot: DataSnapshot? -> object: List<Exercise> 
      // Error here 
      return listOf<Exercise>() 
     } 
    } 

fun DatabaseReference.observeSingleEvent(): Observable<DataSnapshot> { 
    return Observable.create(object : Observable.OnSubscribe<DataSnapshot> { 
     override fun call(subscriber: Subscriber<in DataSnapshot>) { 

      val valueEventListener = object: ValueEventListener { 
       override fun onDataChange(snapshot: DataSnapshot?) { 
        subscriber.onNext(snapshot) 
        subscriber.onCompleted() 
       } 

       override fun onCancelled(error: DatabaseError?) { 
        subscriber.onError(FirebaseDatabaseThrowable(error)) 
       } 
      } 

      addListenerForSingleValueEvent(valueEventListener) 
     } 
    }) 
} 

回答

2

代碼

.map { snapshot: DataSnapshot? -> object: List<Exercise> 

的這部分返回一個可觀察說,snapshot參數的類型這個lambda收到的是DataSnapshot? -> object: List<Exercise>(實際上它不是一個有效的函數類型,那將是DataSnapshot? -> List<Exercise>)。

我相信你真正想要做的是下面的,只是有型DataSnapshot一個snapshot參數:在這裏指定

.map { snapshot: DataSnapshot? -> 
    listOf<Exercise>() 
} 

拉姆達的返回類型沒有,它會只是推斷。您也不需要在lambda表中使用return關鍵字,因爲其中的最後一個表達式是返回的。

+0

這很有道理,謝謝。在寫Kotlin時需要讓Swift擺脫我的頭腦:) – aryaxt

2

@ zsmb13在那裏指出了正確的答案。在這裏,我想對你的lambda表達式中出現的一些錯誤發表評論。

.map { snapshot: DataSnapshot? -> object: List<Exercise> 
     // Error here 
     return listOf<Exercise>() 
} 

object: List<Exercise>這裏是不是一個有效的語法,因爲身體去lambda表達式內部的->跡象之後。我們沒有在正文中指定返回類型。

此外,return這裏係指Kotlin docs描述從fetchExercises()返回:

return語句沒有標籤總是從搭配的樂趣關鍵字聲明的函數返回。這意味着lambda表達式內的返回將從封閉函數返回,而匿名函數內的返回將從匿名函數本身返回。

正如@ zsmb13所說的,大多數情況下不需要return。如果你真的想要它(流量控制),你可以使用qualified returns

//This is answer from @zsmb13 
.map { snapshot: DataSnapshot? -> 
    [email protected] listOf<Exercise>() 
}