kotlin nullable类型和typescript,swift中的可选类型是类似的,使用方式略有一些不同。
安全访问符 ?.
var result: Int? = 30
val newResult = result?.plus(5) // 35
var a: Int? = null
println("a: ${a?.plus(10)}") // a: null
强制解包 !!
这个和swift中的 隐式解包类型 一样,需要注意的是,要确保可选类型的值不为空,否则解包抛错
// kotlin
var a: Int? = 10
val result = a!! + 1 // 11
但是 a
如果后面设置为 null
, 则会抛出错误, 因此一般不使用这种方式解包
// kotlin
a = null
val otherResult = a!! + 10 // 错误 kotlin.KotlinNullPointerException
Swift 中的用法
// swift
var a: Int! = 10 // Int! 隐式解包类型
let b = a! + 10 // 强制解包
print("b: \(b)") // b: 20
内联作用域函数 let
对于上面的可选类型的使用,为了避免取到空值,一般需要进行验空判断
var a: Int? = null
if (a != null) {
print("${a + 10}")
} else {
print("a is null")
}
这样写显得很啰嗦,kotlin提供了一个 let
作用域函数
var age: Int? = null
age?.let { a ->
println("your age is $a")
}
另外这个作用域函数提供了一个默认值 it
var age: Int? = null
// 使用默认的it 进行精简
age?.let {
println("your age is $it")
}
kotlin中的这个 let
作用域函数,给我的感觉有点类似swift中的 guard
// swift
var age: Int? = 10
guard let yourAge = age else {
print("your age is unknown")
return
}
print("your age is \(yourAge)") // 打印
另外kotlin中的let还可以配合 前面碰到的 ?:
提供默认值
// kotlin
var age: Int? = null
// 使用默认值
age?.let {
println("your age is $it")
} ?: println("your age is unknown")
// 打印 your age is unknown
另外值得注意的是,kotlin中可以使用 val
声明nullable类型,和 var
不同的是,使用 val
声明之后,可选类型不能重新赋值,使用 var
声明也需要初始化(这一点和swift中不一样)
val name: String? = "james"
name = "kobe" // 报错 Val cannot be reassign
// 必须初始化一个值
var age: Int? = null
知识点:
- 安全访问符
?.
- 强制解包
!!
-
let 作用域函数的使用
-
it
关键词 - 配合
?:
提供默认值
-
2019年07月24日00:13:54
网友评论