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

if let a = b.val {

} else {

}

当前回答

让我们首先确保我们理解了所提供的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习惯用法相同的语义。

其他回答

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

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

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

下面是如何只在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"
}

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

yourOptionalString ?: return

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

如果让我们使用内联的乐趣,我们可以得到像Swift一样的unwring语法

inline fun <T:Any?> T?.unwrap(callback: (T)-> Unit) : Boolean {
    return if (this != null) {
        this?.let(callback)
        true
    }else {
        false
    }
}

用途::

        val  name : String? = null
        val  rollNo : String? = ""
        var namesList: ArrayList<String>?  = null

        if (name.unwrap { name ->

                Log.i("Dhiru", "Name have value on it  $name")

            })else if ( rollNo.unwrap {
                Log.i("Dhiru","Roll have value on it")

            }) else if (namesList.unwrap {  namesList  ->
                Log.i("Dhiru","This is Called when names list have value ")
            })  {
             Log.i("Dhiru","No Field have value on it ")
        }

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

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