Kotlin - 等同于Swift的“if let + cast”的组合

时间:2017-05-29 07:28:31

标签: android kotlin

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

在swift中:

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

5 个答案:

答案 0 :(得分:20)

一种选择是使用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) {
    ...
}

答案 1 :(得分:4)

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 

答案 2 :(得分:4)

在Kotlin你可以使用let:

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

此解决方案最接近保护,但可能有用。

答案 3 :(得分:1)

在Kotlin你可以使用:

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

as?the source code,返回null而不是在失败时抛出错误。

答案 4 :(得分:0)

这个怎么样?

val user = getUser() ?: return