美文网首页
#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