2016-03-08 68 views
3

如果我有這樣的:如何定義ONELINE函數調用一個可空變量函數

fun showProgressView() = ultraRecyclerView?.showProgressBar()

它說,它返回Unit?,而不是Unit(編輯)

-----編輯-----

單程可以是 fun showProgressView() = ultraRecyclerView?.showProgressBar() ?: Unit 但它看起來不適合我。

另一種方式: fun showProgressView() { ultraRecyclerView?.showProgressBar() } 但我無法找到一種方式爲android工作室保持該格式。

+1

如果您想要一個非空返回類型,您可以簡單地在末尾添加「?:Unit」。 – hotkey

+0

'fun showProgressView()= ultraRecyclerView?.let {it.showProgressBar()}'? –

+0

@XOOLOOO仍然返回'單元?' –

回答

6

如果使用函數的短表達式形式,則表達式的推斷結果類型將確定函數的返回類型。如果這是來自Java的平臺類型,那麼它可能是空的。如果它是Kotlin類型,那麼它將知道正確的可空性。

但是由於您使用的是安全運算符?.,因此您確定它可以爲空。如果結果是nullUnit那麼給出推斷結果類型Unit?

這很奇怪,但正是你所說的。因此,請使用{ .. }的正常函數體,或者在可能的情況下爲函數提供顯式返回類型。

fun showProgressView(): Unit { ultraRecyclerView?.showProgressBar() } 

您也可以刪除空性,通過對Unit?創建擴展功能:

fun Unit?.void() = Unit 

,每當你要修復的返回類型使用它:

fun showProgressView() = ultraRecyclerView?.showProgressBar().void() 
+1

是否曾有過「單元」和「單元?」之間的區別是相關的情況?我現在無法真正想到任何東西,但也許我忽略了一些東西。對我來說,似乎編譯器應該自動推斷返回類型爲「Unit」。 – mhlz

+1

@mhlz這將是一個別的討論,https://youtrack.jetbrains.com,鬆弛頻道,或討論論壇。單元不是特別的,代碼是不明確的,所以我個人比較喜歡用'Unit?'作爲表達式的時候報錯。但是這對我來說並不是那麼重要,並且準確地說它是在做什麼。 –

+0

https://youtrack.jetbrains.com/issue/KT-11343完成 – Caipivara

2

的IntelliJ IDEA/Android Studio似乎沒有將塊體功能的樣式保留在一行上的設置。即便如此,你可以使用run來解決這個問題:

fun showProgressView() = run<Unit> { ultraRecyclerView?.showProgressBar() } 

通常你並不需要顯式類型參數添加到run但在這種情況下,他們提供給你所需的方法簽名(的Unit而不是返回類型Unit?)。

注意:這個答案改編自我給why assignments are not statementscomment