如何定义一个调用可空变量函数的oneline函数

时间:2016-03-08 21:24:23

标签: kotlin

如果我有类似的话:

fun showProgressView() = ultraRecyclerView?.showProgressBar()

它说它返回Unit?而不是Unit(已编辑)

- - - - - - - - 编辑

一种方法可以 fun showProgressView() = ultraRecyclerView?.showProgressBar() ?: Unit 但它看起来不适合我。

另一种方式: fun showProgressView() { ultraRecyclerView?.showProgressBar() } 但是我找不到安卓工作室维护这种格式的方法。

2 个答案:

答案 0 :(得分:6)

如果使用函数的短表达式,则表达式的推断结果类型确定函数返回类型。如果这是来自Java的平台类型,它可以是可空的。如果它是Kotlin类型,那么它将知道正确的可空性。

但是,因为你使用安全操作符?.,你肯定会说它可以为空。如果结果为nullUnit,则会提供推断结果类型Unit?

这很奇怪,但正是你所说的。因此,要么使用带有{ .. }的普通函数体,要么在可能的情况下为函数提供显式返回类型。

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

您还可以通过在Unit?上创建扩展功能来删除可空性:

fun Unit?.void() = Unit

每当您想要修复返回类型时使用它:

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

答案 1 :(得分:3)

IntelliJ IDEA / Android Studio似乎没有设置将块体功能的样式保留在一行上。即便如此,您也可以使用run来解决这个问题:

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

通常,您不需要向run添加显式类型参数,但在这种情况下,提供它们会为您提供所需的方法签名(返回类型为Unit而不是Unit?)。< / p>

注意:此答案改编自comment我提交给why assignments are not statements