美文网首页
04 可选类型

04 可选类型

作者: 程序小胖 | 来源:发表于2020-03-26 08:42 被阅读0次

    一,可选(Optionals)类型

    什么是可选类型呢,简言之,就是用 let/var 定义的一个值,可以为nil。可选类型又课程之为可选项。

    二,可选类型的定义

    • 1、在类型后面加上后缀 ? 来定义一个可选项(常用)
    • 2、直接用标识Optional来表示,Optional<String>
    var name: String? = "小张"
    name = nil // 此时name 是可以赋值为 nil 的
    
    var name1: Optional<String> = "小张"
    var age: Int? // 先定义后赋值
    age = 18
    age = nil
    
    let age2: Int? // 也可以定义为常量
    age2 = 30
    
    注意:从数组和字典中取出的值其实也是可选类型的
    // 数组
    var numbers = [1, 2, nil, 3]
    print(numbers[0])
    print(numbers[2])
    
    // 字典
    var numberDic = ["age" : "18", "name" : "zxd", "height" : nil]
    print(numberDic["age"])
    print(numberDic["height"])
    
    image.png
    三,强制解包

    从上面的打印结果来看,数组或是字典的取值,都会有OPtional()这个东西,说明这些值是可选类型。
    所以说,可选类型是对其他类型的一层包装,可以将它理解成一个盒子

    • 1,如果是nil,那么就是一个空盒子
    • 2,如果不是nil,那么盒子里装的是:被包装类型的数据
      如果要将Optional()中的值取出来(将盒子里面的东西取出来),需要使用感叹号 ! 强制解包

    例如:

    var name: String? = "小张" 
    print(name)
    print(name!)
    
    // 打印结果
    Optional("小张")
    小张
    
    注意:如果可选类型是nil,在进行强制解包,会产生运行时错误
    // 如果值为nil,强制解包就会报错
    var name2: String? // 默认是nil
    print(name2!)
    
    // 报错
    Fatal error: Unexpectedly found nil while unwrapping an Optional value: file 04 可选类型.xcplaygroundpage, line 33
    Playground execution failed:
    
    error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
    The process has been left at the point where it was interrupted, use "thread return -x" to return to the state before expression evaluation.
    
    四,可选项绑定

    由上面的例子可以看出,可选类型在强制解包时是非常危险的,指不定那个地方就为Nil了。所以一般在使用时,首先要判空。

    所以,就可以用 可选项绑定 来判断可选项 是否有值
    如果有值就自动解包,将值赋值给一个临时变量或常量,并返回true,否则返回false

    // Int转换,返回的结果就是一个可选类型
    var number = Int("123")
    // 通过可选项绑定,来判断
    if let number = Int("123") {
        print("转换成功:\(number)")
        // number 就是 强制解包 后的值,number!
        // number 的作用域就是这个{}内
    }else {
        print("转换失败")
    } 
    
    五,自动解包(隐式解包)
    // 自动解析(隐式解包)
    var num1: Int! = 10
    var num2: Int = num1
    if num1 != nil {
        print(num1 + 10) // 20
    }
    
    if let num3 = num1 {
        print(num3) // 10
    }
    
    var num4: Int! = nil
    var num5: Int = num4
    // 报运行时错误,所以一般在开发中不建议 使用 隐式解包 的写法
    

    相关文章

      网友评论

          本文标题:04 可选类型

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