在Kotlin有一个相当于Swift代码下面?
if let a = b.val {
} else {
}
在Kotlin有一个相当于Swift代码下面?
if let a = b.val {
} else {
}
当前回答
我添加这个答案是为了澄清已接受的答案,因为它太大了,不适合评论。
这里的一般模式是,你可以使用Kotlin中可用的范围函数的任何组合,由Elvis操作符分隔,如下所示:
<nullable>?.<scope function> {
// code if not null
} :? <scope function> {
// code if null
}
例如:
val gradedStudent = student?.apply {
grade = newGrade
} :? with(newGrade) {
Student().apply { grade = newGrade }
}
其他回答
在kotlin中也有类似的方法来实现Swift的if-let风格
if (val a = b) {
a.doFirst()
a.doSecond()
}
您还可以分配多个可空值
if (val name = nullableName, val age = nullableAge) {
doSomething(name, age)
}
如果可空值被使用超过1次,这种方法将更适合。在我看来,它从性能方面有所帮助,因为可为空的值将只检查一次。
来源:Kotlin Discussion
也许我已经很晚了,但最简单的方法是打开和选择
yourOptionalString ?: return
这是下面的所有行都将有解开的字符串
我的答案完全是抄袭别人的。但是,我不容易理解他们的表情。所以我想提供一个更容易理解的答案会很好。
迅速:
if let a = b.val {
//use "a" as unwrapped
}
else {
}
在芬兰湾的科特林:
b.val?.let{a ->
//use "a" as unwrapped
} ?: run{
//else case
}
这是我的变体,仅限于非常常见的“if not null”情况。
首先,在某个地方定义它:
inline fun <T> ifNotNull(obj: T?, block: (T) -> Unit) {
if (obj != null) {
block(obj)
}
}
它可能应该是内部的,以避免冲突。
现在,转换这个Swift代码:
if let item = obj.item {
doSomething(item)
}
到这个Kotlin代码:
ifNotNull(obj.item) { item ->
doSomething(item)
}
请注意,在Kotlin中,你可以删除参数并使用它:
ifNotNull(obj.item) {
doSomething(it)
}
但是如果代码块超过1-2行,最好是显式的。
这是我所能找到的最相似的斯威夫特。
下面是如何只在name不为空时执行代码:
var name: String? = null
name?.let { nameUnwrapp ->
println(nameUnwrapp) // not printed because name was null
}
name = "Alex"
name?.let { nameUnwrapp ->
println(nameUnwrapp) // printed "Alex"
}