在Kotlin有一个相当于Swift代码下面?

if let a = b.val {

} else {

}

当前回答

在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

其他回答

在我看来,最干净的选择是这样的

迅速:

if let a = b.val {

} else {

}

科特林

b.val.also { a ->

} ?: run {

}

这是我的变体,仅限于非常常见的“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行,最好是显式的。

这是我所能找到的最相似的斯威夫特。

也许我已经很晚了,但最简单的方法是打开和选择

yourOptionalString ?: return

这是下面的所有行都将有解开的字符串

如果b是一个成员变量,那么这种方法对我来说似乎是最有可读性的:

val b = this.b
if (b == null) {
    return
}
println("non nullable : ${b}")

这也与它在swift中的工作方式一致,在swift中,一个新的局部变量遮蔽了成员变量。

我添加这个答案是为了澄清已接受的答案,因为它太大了,不适合评论。

这里的一般模式是,你可以使用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 }
}