在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中可用的范围函数的任何组合,由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 }
}
让我们首先确保我们理解了所提供的Swift习语的语义:
if let a = <expr> {
// then-block
}
else {
// else-block
}
它的意思是:“如果<expr>结果为非nil可选,则输入then块,并将符号a绑定到未包装的值。否则进入else块。
特别注意,a只在then块内绑定。在Kotlin中,您可以通过调用很容易地得到这个
<expr>?.also { a ->
// then-block
}
你可以像这样添加一个else-block:
<expr>?.also { a ->
// then-block
} ?: run {
// else-block
}
这将导致与Swift习惯用法相同的语义。
这是我的变体,仅限于非常常见的“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行,最好是显式的。
这是我所能找到的最相似的斯威夫特。
如果b是一个成员变量,那么这种方法对我来说似乎是最有可读性的:
val b = this.b
if (b == null) {
return
}
println("non nullable : ${b}")
这也与它在swift中的工作方式一致,在swift中,一个新的局部变量遮蔽了成员变量。
也许我已经很晚了,但最简单的方法是打开和选择
yourOptionalString ?: return
这是下面的所有行都将有解开的字符串