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

2023-12-22

我在看the docs http://kotlinlang.org/docs/reference/control-flow.html从 Kotlin 网站来看,控制流表达式只有两个:if and when.

For if:

该表达式需要有一个else branch

For when:

The else如果没有满足其他分支条件,则评估分支。如果when用作表达式,则else分支是强制性的,除非编译器可以证明所有可能的情况都包含分支条件。

Question

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


将会出现以下代码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 at a let块,它返回最后一个语句,从而使用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作为一种表达方式。

P.S.

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())
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我们必须用 Kotlin 中的所有控制流表达式覆盖所有分支? 的相关文章

随机推荐

  • 如何通过 Javascript 动态创建表单

    我的网站 Aweber 注册表收到大量垃圾邮件 我被告知要在页面呈现后通过 JavaScript 或通过单击按钮动态创建表单 我如何通过 javascript 创建和呈现表单 一些事情如下 在 body 标签之后添加此内容 这是一个粗略的草
  • Azure Devops 管道 yml 在各个阶段循环

    我如何循环遍历数组或对象来创建阶段 下面是一个有效的 yml 文件 您可以看到构建阶段在作业的参数环境上循环 在发布阶段是否有可能实现同样的目标 发布阶段需要手动批准 必须按顺序运行并且只有在前一阶段成功完成后才能运行 parameters
  • Camera.set 预览{@override onPreviewFrame() } 不起作用

    我想要录制视频并分析当前位图在服务中 所以我注册surfaceHolder addCallback in onStartCommand功能 And set mCamera setPreviewCallback in surfaceCreat
  • ListView 抖动中的问题开关值

    我在 ListView 中为每个元素创建一个 Switch 小部件 当我单击开关时 所有元素的值都会更改 我检查了 flutter 文档 dart 文档 我想 我没有恢复 onChanged 方法中的元素位置 但怎么办呢 当我单击时 我的值
  • 带有 URL 编码数据的 Spring RestTemplate POST 请求

    我是 Spring 新手 正在尝试使用 RestTemplate 执行休息请求 Java 代码应执行与以下curl 命令相同的操作 curl data name feature color 5843AD header PRIVATE TOK
  • android中每个列表项都有viewpager的listview

    在将数据设置为列表视图中的列表项时 我需要您的帮助 在我的列表视图中 每个项目都有一个 ViewPager 每个 viewpager 应该有不同的数据 我不知道如何为每个视图页面设置不同的数据 实际上 基于列表项索引 我需要设置数据视图页面
  • 使用ip route add为多台设备添加组播路由

    TLDR 有没有办法使用 ip Route 为多个网卡添加多播路由 我们有软件将两个绑定到不同 NICS 上不同 IP 地址的套接字连接到两个单独的多播组 例如套接字 1 绑定到 192 168 0 2 并加入多播组 233 255 10
  • 当没有输出时 Process.StandardOutput.Readline() 挂起

    Note 我正在尝试跑步packer exe作为解决特定问题的后台进程azure arm构建器 我需要观察输出 我没有使用Start Process因为我不想使用中间文件来使用输出 我设置了以下代码packer exe在后台运行 以便我可以
  • 白色背景上带有浮动标签的 TextInputLayout Android 中的可见性问题

    我正在创建具有 textinputlayout 浮动标签的简单登录屏幕 下面给出了 java 文件和 xml protected void onCreate Bundle savedInstanceState super onCreate
  • Control.ClientRectangle 与 Control.DisplayRectangle

    我了解有关表单 控件的客户端矩形的概念 但我不明白之间有什么区别 Control ClientRectangle and Control DisplayRectangle 在阅读了这两个属性的 MSDN 页面后 并不清楚其中一个何时会返回与
  • 为什么我们需要 Hadoop 无密码 ssh?

    AFAIK 需要无密码 ssh 以便主节点可以在每个从节点上启动守护进程 除此之外 无密码ssh对于Hadoop的操作有什么用处吗 用户代码 jar 和数据块如何跨从节点传输 我想知道所使用的机制和协议 无密码 SSH 应该只配置为主从对
  • 在 PHP 中如何检查数组中的所有键是否都有空值? [复制]

    这个问题在这里已经有答案了 我有一个数组 array array key1 gt null key2 gt null key3 gt null key4 gt null 我想确定是否所有数组键都有空值 如果是 则返回 false 上面的示例
  • Swift 4:将字典添加到 Plist

    所以 我有一个空的 plist 我试图在 plist 中创建这些值 使用此代码 let dictionary String String key1 value1 key2 value2 key3 value3 let documentDir
  • 将 iOS 键盘布局更改为表情符号?

    当 UITextField 成为第一响应者时 是否可以将键盘布局更改为表情符号 或根据用户操作 例如点击 UIButton 我知道我可以将键盘布局更改为以下之一 typedef enum UIKeyboardTypeDefault Defa
  • 我应该使用 OpenId 的哪个 Erlang 实现(如果有)?

    我需要 OpenId 协议的 Erlang 实现 我发现了以下内容 但这似乎是一个处于早期阶段的项目 http code google com p erlopenid http code google com p erlopenid 关于我
  • python 中的 next() 真的那么快吗?

    通过这里的一篇文章 我读到使用 next 搜索和检索列表中元素的第一次出现可能会很快 然而 我惊讶地发现传统的 for if break 语法在相当长一段时间内表现得更好 如果我的分析有错误 请纠正我 这是我尝试过的一个片段 gt gt g
  • 错误:HTTP 错误:400,项目“my_project”不是启用 Firestore 的项目

    当我运行命令时firebase deploy我收到此错误 错误 HTTP 错误 400 项目 my project 不是启用 Firestore 的项目 您是否正在尝试使用 Cloud Firestore 如果是这样 请访问控制台的数据库部
  • 我们如何在 ionic 应用程序中隐藏启动屏幕?

    无论如何 在离子应用程序中隐藏或不显示启动屏幕 并且电容器中的启动屏幕时间较少或在科尔多瓦中较少 以及如何减少离子应用程序中的启动屏幕时间 谢谢 这是禁用启动画面的调整 在 config xml 文件中
  • UIViewController 包含像 Google+ 这样的动画

    理解我想要解释的内容的最好方法是打开Google 应用程序并点击主帖子流中显示的帖子背景中的任意位置 当您点击它时 整个帖子会以漂亮的动画自动移动到屏幕中央 并在其下方加载帖子的评论 我认为这是一个常见的UIViewController遏制
  • 我们必须用 Kotlin 中的所有控制流表达式覆盖所有分支?

    我在看the docs http kotlinlang org docs reference control flow html从 Kotlin 网站来看 控制流表达式只有两个 if and when For if 该表达式需要有一个els