【问题标题】:Kotlin - equivalence to Swift's combination of "if let + cast"Kotlin - 相当于 Swift 的“if let + cast”组合
【发布时间】:2017-05-29 07:28:30
【问题描述】:

我正在尝试找出如何在kotlin中实现“if let + cast”的组合:

迅速:

if let user = getUser() as? User {
   // user is not nil and is an instance of User
}

我看到了一些文档,但他们对这种组合只字未提

https://medium.com/@adinugroho/unwrapping-sort-of-optional-variable-in-kotlin-9bfb640dc709 https://kotlinlang.org/docs/reference/null-safety.html

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    一种选择是使用safe cast operator + safe call + let

    (getUser() as? User)?.let { user ->
        ...
    }
    

    另一种方法是在传递给 let 的 lambda 中使用 smart cast

    getUser().let { user ->
        if (user is User) {
            ...
        }
    }
    

    但也许最易读的方法是只引入一个变量并在此处使用智能转换:

    val user = getUser()
    if (user is User) {
        ...
    }
    

    【讨论】:

    • 我认为您在第一个示例中使用的是“安全呼叫”(?. )而不是“elvis 操作员”(?:)。
    • 很明显,Swift 添加的 if let 语法是天才,这些选择很差,而且越来越差..
    • 您可能需要替换“as?”用“as”跳过使用断言运算符!在 let (getUser() as?User)?.let { user -> user!! ... } 可能是: (getUser() as User)?.let { user -> user ... }
    【解决方案2】:

    Kotlin 可以根据常规 if 语句自动判断当前范围内的值是否为 nil,无需特殊语法。

    val user = getUser()
    
    if (user != null) {
        // user is known to the compiler here to be non-null
    }
    

    反之亦然

    val user = getUser()
    
    if (user == null) {
        return
    }
    
    // in this scope, the compiler knows that user is not-null 
    // so there's no need for any extra checks
    user.something 
    

    【讨论】:

    • 这是 Kotlin 的一个很棒的部分!
    【解决方案3】:

    在 Kotlin 中,您可以使用 let:

    val user = getUser()?.let { it as? User } ?: return
    

    这个解决方案最接近守卫,但它可能有用。

    【讨论】:

    • 值必须在 ? 的另一边返回:
    【解决方案4】:

    在 Kotlin 中你可以使用:

    (getUser() as? User)?.let { user ->
      // user is not null and is an instance of User
    }
    

    as? 是一个 'safe' cast operator,它返回 null 而不是在失败时抛出错误。

    【讨论】:

      【解决方案5】:

      这个呢?

      val user = getUser() ?: return
      

      【讨论】:

      • 这很好,相当于一个 nil 合并运算符。 val value: String = data?.first() ?: "Nothing here."
      • 这种语法很糟糕而且难以辨认。为什么谷歌没有抄袭什么好?
      • @JBarros35 Google 没有写 Kotlin。
      猜你喜欢
      • 2021-05-02
      • 2019-02-08
      • 2018-03-25
      • 2021-02-27
      • 1970-01-01
      • 1970-01-01
      • 2015-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多