对于适用于可空结果的完全一般情况,我无法在Kotlin中找到一种自然的方式来表达这一点,而不会将 a 泄漏到 then -block之外的范围内 .
131
以下是当 name 不为null时如何仅执行代码:
var name: String? = null
name?.let { nameUnwrapp ->
println(nameUnwrapp) // not printed because name was null
}
name = "Alex"
name?.let { nameUnwrapp ->
println(nameUnwrapp) // printed "Alex"
}
0
在kotlin中有类似的方式来实现Swift的风格if-let
if (val a = b) {
a.doFirst()
a.doSecond()
}
您还可以分配多个可空值
if (val name = nullableName, val age = nullableAge) {
doSomething(name, age)
}
6 回答
您可以像这样使用
let
函数:请注意,只有在需要代码块时才需要调用
run
函数 . 如果在elvis-operator(?:
)之后只有一个oneliner,则可以删除run
-block .请注意,如果
b
为空,或者let
-block计算结果为null
,则将评估run
块 .因此,您通常只需要
if
表达式 .在这种情况下,只有
b
为空时才会评估else
-block .让我们首先确保我们理解所提供的Swift习语的语义:
这意味着:“如果
<expr>
导致非零可选,则输入then
-block,其符号a
绑定到未包装的值 . 否则输入else
块 .特别注意
a
仅在then
-block中绑定 . 在Kotlin,您可以通过致电轻松获得此信息你可以像这样添加
else
-block:这导致与Swift习语相同的语义 . 但是,如果您希望将整个习语视为表达式并检索其结果,那么仍然存在差异,因此在Swift中:
如果
result
属于非可选类型,那么您可以使用此成语:它以间接方式工作:我们正在计算一个非空值,因此
<expr>?.let {...}
评估为null
意味着<expr>
被评估为null
.对于适用于可空结果的完全一般情况,我无法在Kotlin中找到一种自然的方式来表达这一点,而不会将
a
泄漏到then
-block之外的范围内 .以下是当
name
不为null时如何仅执行代码:在kotlin中有类似的方式来实现Swift的风格if-let
您还可以分配多个可空值
如果可空值使用超过1次,这种方法将更合适 . 在我看来,它有助于从性能方面,因为可以为空的值只检查一次 .
来源:Kotlin Discussion
我的答案完全是来自其他人的副本猫 . 但是,我无法轻易理解他们的表达方式 . 所以我想提供一个更容易理解的答案会更好 .
在迅捷:
在Kotlin:
与Swift不同,在Kotlin中使用它之前无需打开可选项 . 我们可以检查该值是否为非null,并且编译器跟踪有关您执行的检查的信息,并允许将其用作未包装的 .
在Swift中:
在Kotlin:
有关此类用例,请参阅Documentation: (null-safety)