可选

可选类型是这样一种类型,它的变量可以包含值,也可以不包含值。两种语言都提供了对可选类型的广泛支持。

使用可选类型的一个例子是readLine()函数。两种语言都提供了这个函数,它从控制台中读取一行文本。这个函数的一个不太明显的技术问题是,用户可以通过按control-d组合键来取消控制台的读取操作,这将生成一个文件结束字符。在这种情况下,readLine()函数将返回特殊值null,这表示没有值。

芬兰湾的科特林

可选的或可空的类型通过放置?在基础类型之后。

print(“输入你的名字:”)val name: String?= readLine ()

本例中name的类型是一个可空字符串。如果用户通过按control-d取消读取,name将包含特殊值null;否则,它将包含一个String。

可能存在的空值会使调用成员函数或访问属性等操作复杂化。在Java中,如果你尝试在null上调用一个方法,你将得到一个空指针异常。Kotlin旨在通过使用一组特殊的语言特性,在很大程度上消除空指针异常的可能性。其中最基本的是安全调用操作符。

println(“你的名字里有$(name?.length)个字母”)

安全调用操作符被设计为在赢博体育于null时返回null。如果该值不为空,则安全调用操作符将继续正常访问该属性或方法。

安全调用操作符的另一种选择是Elvis操作符?:,它允许您指定一个默认值,以便在将其赢博体育于的变量的值为空时使用:

你的名字有$(name?)长度:0个字母。”)

斯威夫特

Swift对可选类型提供了类似的支持。在Swift中,null值是nil而不是null。

print(“输入你的名字:”)val name: String?= readLine ()

Swift还提供了一个安全的呼叫操作符:

println(“你的名字里有\(name?.length)个字母”)

Swift中与Kotlin Elvis算子等价的是nil-coalescing算子??:

你的名字有$(name?)长度? ?里面没有字母。”)

Swift还提供了一个条件解包裹结构,允许你指定当一个值不是nil或nil时要做什么:

if let actualName = name {print(“你的名字中有\(actualName.length)个字母”)else {print(“你没有输入名字”)}

力展开

如果您确定可选类型不包含空值,则可以通过使用强制展开操作符(!)将可选类型强制为非可选类型。在Swift和!!在芬兰湾的科特林):

迅速:

val name = readLine() //名称类型为字符串?if name! = nil {print(“您的名字中有\(name!.length)个字母”)}else {print(“您没有输入名字”)}

在芬兰湾的科特林:

val name = readLine() //名称类型为字符串?if (name! = null) {print(“您的名字中有\(name!! !.length)个字母”)}else {print(“您没有输入名字”)}