首页 文章

斯威夫特,如果让我和其他在科特林

提问于
浏览
59

在Kotlin中有一个等同于下面的Swift代码吗?

if let a = b.val {

}
else {

}

6 回答

  • 15

    您可以像这样使用 let 函数:

    val a = b?.let {
        // If b is not null.
    } ?: run {
        // If b is null.
    }
    

    请注意,只有在需要代码块时才需要调用 run 函数 . 如果在elvis-operator( ?: )之后只有一个oneliner,则可以删除 run -block .

    请注意,如果 b 为空,或者 let -block计算结果为 null ,则将评估 run 块 .

    因此,您通常只需要 if 表达式 .

    val a = if (b == null) {
        // ...
    } else {
        // ...
    }
    

    在这种情况下,只有 b 为空时才会评估 else -block .

  • 0

    让我们首先确保我们理解所提供的Swift习语的语义:

    if let a = <expr> {
         // then-block
    }
    else {
         // else-block
    }
    

    这意味着:“如果 <expr> 导致非零可选,则输入 then -block,其符号 a 绑定到未包装的值 . 否则输入 else 块 .

    特别注意 a 仅在 then -block中绑定 . 在Kotlin,您可以通过致电轻松获得此信息

    <expr>?.also { a ->
        // then-block
    }
    

    你可以像这样添加 else -block:

    <expr>?.also { a ->
        // then-block
    } ?: run {
        // else-block
    }
    

    这导致与Swift习语相同的语义 . 但是,如果您希望将整个习语视为表达式并检索其结果,那么仍然存在差异,因此在Swift中:

    let result = if let a = <expr> {
        // then-block
    }
    else {
        // else-block
    }
    

    如果 result 属于非可选类型,那么您可以使用此成语:

    val result = <expr>?.let { a ->
        // then-block
    } ?: run {
        // else-block
    }
    

    它以间接方式工作:我们正在计算一个非空值,因此 <expr>?.let {...} 评估为 null 意味着 <expr> 被评估为 null .

    对于适用于可空结果的完全一般情况,我无法在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)
    }
    

    如果可空值使用超过1次,这种方法将更合适 . 在我看来,它有助于从性能方面,因为可以为空的值只检查一次 .

    来源:Kotlin Discussion

  • 4

    我的答案完全是来自其他人的副本猫 . 但是,我无法轻易理解他们的表达方式 . 所以我想提供一个更容易理解的答案会更好 .

    在迅捷:

    if let a = b.val {
      //use "a" as unwrapped
    }
    else {
    
    }
    

    在Kotlin:

    b.val?.let{a -> 
      //use "a" as unwrapped
    } ?: run{
      //else case
    }
    
  • 0

    与Swift不同,在Kotlin中使用它之前无需打开可选项 . 我们可以检查该值是否为非null,并且编译器跟踪有关您执行的检查的信息,并允许将其用作未包装的 .

    在Swift中:

    if let a = b.val {
      //use "a" as unwrapped
    } else {
    
    }
    

    在Kotlin:

    if b.val != null {
      //use "b.val" as unwrapped
    } else {
    
    }
    

    有关此类用例,请参阅Documentation: (null-safety)

相关问题