美文网首页
#5 kotlin nullable 可空类型

#5 kotlin nullable 可空类型

作者: JamesSawyer | 来源:发表于2019-07-24 01:14 被阅读0次

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

相关文章

网友评论

      本文标题:#5 kotlin nullable 可空类型

      本文链接:https://www.haomeiwen.com/subject/oozzlctx.html