Kotlin是否具有与Swift Optional类似的类型?

时间:2018-08-06 17:54:43

标签: swift kotlin

Swift在其核心库中具有枚举类型Optional,这意味着您可以查看一些代码来了解Swift如何处理可选内容(例如??运算符),甚至可以在其中添加自己的扩展名。

Kotlin的基础库中是否有类似的类型?还是所有Kotlin的可为空类型都在语言/语法/编译器级别处理?我已经阅读了the very spartan Null Safety section of the Kotlin manual,但没有找到任何有关特定的null包装器类型的提示。

3 个答案:

答案 0 :(得分:3)

后缀?与Swift的Optional等效,不同的是它不是Swift中的枚举,因为它不是一流的值,它返回到JVM的原始null代替。

您可以在可为null的类型上添加扩展名,例如:

fun <T> Collection<T>?.isNullOrEmpty(): Boolean {
    return this == null || isEmpty()
}

它与Swift不太一样,因为您需要选择一个基类(例如Collection<T>),但是功能相似。

您还可以在Kotlin中访问Java 8的java.util.Optional<T>,但这只是一团糟,最好避免。

答案 1 :(得分:0)

默认情况下,Kotlin数据类型不可为空。您可以通过添加问号来创建可为空的数据类型:

var a: String = "Hello!"   // non-nullable
var b: String? = null  // nullable

从不可为空的值到可为空的类型的转换是自动的。还有类似Swift的null传播语法。

答案 2 :(得分:0)

不,kotlin中没有内置功能,但是我们可以使用inline fun

获得相同的可选拆包语法。
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 ")
        }