我正试图找出如何在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
答案 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