在Kotlin有一个相当于Swift代码下面?
if let a = b.val {
} else {
}
在Kotlin有一个相当于Swift代码下面?
if let a = b.val {
} else {
}
当前回答
我的答案完全是抄袭别人的。但是,我不容易理解他们的表情。所以我想提供一个更容易理解的答案会很好。
迅速:
if let a = b.val {
//use "a" as unwrapped
}
else {
}
在芬兰湾的科特林:
b.val?.let{a ->
//use "a" as unwrapped
} ?: run{
//else case
}
其他回答
我添加这个答案是为了澄清已接受的答案,因为它太大了,不适合评论。
这里的一般模式是,你可以使用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 }
}
If let语句
Swift if let可选绑定(称为if-let语句)用于提取存在的非可选值,或者如果值为nil则不执行任何操作。
斯威夫特的if-let声明:
let b: Int? = 50
if let a: Int = b {
print("Good news!")
} else {
print("Equal to 'nil' or not set")
}
/* RESULT: Good news! */
在Kotlin中,就像在Swift中一样,为了避免在不期望的情况下试图访问空值而导致的崩溃,提供了一个特定的语法(如第二个例子中的b.let{})来正确地展开可空类型:
Kotlin相当于Swift的if-let语句:
val b: Int? = null
val a = b
if (a != null) {
println("Good news!")
} else {
println("Equal to 'null' or not set")
}
/* RESULT: Equal to 'null' or not set */
Kotlin的let方法与安全调用操作符?:结合使用时,提供了一种处理可空表达式的简洁方法。
Kotlin的内联let函数和Swift的nil合并运算符的Elvis运算符:
val b: Int? = null
val a = b.let { nonNullable -> nonNullable } ?: "Equal to 'null' or not set"
println(a)
/* RESULT: Equal to 'null' or not set */
警卫让声明
Swift中的guard-let语句简单而强大。它检查某些条件,如果计算结果为false,则执行else语句,该语句通常会退出一个方法。
让我们来看看斯威夫特的这句话:
let b: Int? = nil
func method() {
guard let a: Int = b else {
print("Equal to 'nil' or not set")
return
}
print("Good news!")
}
method()
/* RESULT: Equal to 'nil' or not set */
Kotlin对霉霉的保守声明也有类似的影响:
与Swift不同的是,在Kotlin中根本没有警卫声明。但是,您可以使用Elvis Operator - ?:来获得类似的效果。
val b: Int? = 50
fun method() {
val a = b ?: return println("Equal to 'null' or not set")
return println("Good news!")
}
method()
/* RESULT: Good news! */
你可以像这样使用let函数:
val a = b?.let {
// If b is not null.
} ?: run {
// If b is null.
}
注意,只有在需要代码块时才需要调用run函数。如果你在elvis操作符(?:)后面只有一个线性程序,你可以删除运行块。
注意,如果b为空,或者let-block为空,则运行块将被求值。
因此,您通常只需要一个if表达式。
val a = if (b == null) {
// ...
} else {
// ...
}
在这种情况下,只有当b不为空时,else块才会被计算。
上面有两个答案,都得到了很多人的接受:
str ?。让{}?:运行{} str ?。还有{}?:run {}
两者似乎都适用于大多数用法,但#1在下面的测试中会失败:
第二条似乎更好。
在我看来,最干净的选择是这样的
迅速:
if let a = b.val {
} else {
}
科特林
b.val.also { a ->
} ?: run {
}