gpt4 book ai didi

kotlin - 我们必须用 Kotlin 中的所有控制流表达式覆盖所有分支?

转载 作者:行者123 更新时间:2023-12-02 02:53:52 24 4
gpt4 key购买 nike

我查看了the docs从 Kotlin 网站来看,只有两个控制流表达式:ifwhen .

对于if :

the expression is required to have an else branch

对于when :

The else branch is evaluated if none of the other branch conditions are satisfied. If when is used as an expression, the else branch is mandatory, unless the compiler can prove that all possible cases are covered with branch conditions.

问题

看来没有办法在不覆盖所有分支的情况下制作控制流表达式,是吗?如果没有,有没有办法让控制流表达式错过一些分支;如果是这样,为什么?

<小时/>

将出现以下代码if must have both main and 'else' branches if used as an expression

override fun onReceive(context: Context?, intent: Intent?) {
intent?.let {
if (it.action == MySDK.BROADCAST_ACTION_LOGIN) {
mListener.get()?.loggedOn(LoggedOnUserInfo.IT)
}else if (it.action == MySDK.BROADCAST_ACTION_LOGOUT) {
// Occur 'if must have both main and 'else' branches if used as an expression'
mListener.get()?.loggedOut(LoggedOutUserInfo())
}
}
}

但是下面的代码通过编译......

override fun onReceive(context: Context?, intent: Intent?) {
intent?.let {
if (it.action == MySDK.BROADCAST_ACTION_LOGIN) {
mListener.get()?.loggedOn(LoggedOnUserInfo.IT)
context!!.unregisterReceiver(this) // only add this line to test.
}else if (it.action == MySDK.BROADCAST_ACTION_LOGOUT) {
mListener.get()?.loggedOut(LoggedOutUserInfo())
}
}
}

最佳答案

这里的技巧是不要使用 if 作为表达式。我的猜测是,您将 if 放在 let block 中,该 block 返回其最后一条语句,从而使用 if 的“结果”,从而将其视为一个表达式。

我建议扔掉 let 函数(无论如何它在这里都没用):

override fun onReceive(context: Context?, intent: Intent?) {
if(intent != null) {
if (intent.action == MySDK.BROADCAST_ACTION_LOGIN) {
mListener.get()?.loggedOn(LoggedOnUserInfo.IT)
} else if (intent.action == MySDK.BROADCAST_ACTION_LOGOUT) {
mListener.get()?.loggedOut(LoggedOutUserInfo())
}
}
}

您的第二个版本可以编译,因为 context!!.unregisterReceiver(this) 的类型与 mListener.get()?.loggedOut(LoggedOutUserInfo()) 不同,其中使类型不匹配并阻止使用 if 作为表达式。

附注

Kotlin 有很多强大的控制结构。我个人更喜欢这个版本:

override fun onReceive(context: Context?, intent: Intent?) {
intent ?: return
when(intent.action) {
MySDK.BROADCAST_ACTION_LOGIN -> mListener.get()?.loggedOn(LoggedOnUserInfo.IT)
MySDK.BROADCAST_ACTION_LOGOUT -> mListener.get()?.loggedOut(LoggedOutUserInfo())
}
}

关于kotlin - 我们必须用 Kotlin 中的所有控制流表达式覆盖所有分支?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40839544/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com