2017-05-05 31 views
3

在連接到藍牙設備的應用程序,我使用的使用RxKotlin以下功能:的Rx科特林:地圖功能無法推斷返回類型

private fun startBluetoothPair(device: BluetoothDevice) { 
    Observable.just(device) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .map { 
      var uuid: UUID = BLUETOOTH_UUID 
      var socket = it.createRfcommSocketToServiceRecord(uuid) 
      socket.connect() 
      return socket 
     } 
     .subscribe { 
      // Do something with the BluetoothSocket 
     } 
} 

這個函數應該簡單地與後臺連接BluetoothDevice類然後用套接字做一些事情(再次在mainthread中)。然而,map不能處理return socket部分,告訴我有一個Type mismatch,它發現一個BluetoothSocket它需要一個Unit

這裏怎麼回事?我認爲地圖應該能夠推斷返回類型。

+0

您是否嘗試過'return @ scan'而不是'return'? – Rehan

+0

@Rehan:謝謝,那可行! (或者至少,它不再抱怨了,現在不能測試)但是對於我來說,'scan'看起來像純粹的魔法......這是幹什麼用的?謹慎闡述? – Marcel50506

+1

它用於避免模糊和返回嵌套函數中的值,就像上面的情況一樣。自從我上週更新kotlin插件以來,我已經看到了android工作室的建議。你可以在這裏閱讀更多細節(https://kotlinlang.org/docs/reference/returns.html#return-at-labels)和[here](http://kotlinlang.org/docs/reference/lambdas。 html#lambda-expression-syntax):) – Rehan

回答

15

在你的地圖功能與

[email protected] socket 

因爲回報語句通常用於返回頂級函數值代替聲明

return socket 

。對於lambda表達式和內嵌(嵌套)函數,請在標籤處使用返回,即return @ {method_name}。你也可以把最後一行留在socket的情況下,編譯器會爲你處理它,假設最後一行是內聯函數的返回值。但爲了更好的可讀性,我絕對會選擇合格的返回語法。您可以在kotlin文檔中閱讀更多詳細信息herehere

+0

謝謝你哥們<3 –