• swift学习笔记->可选(optional)


    声明一个可选的对象

    var str: String? = "asdfasdf" //str是一个可以设置nil的String
    
    //enum Optional{case None case Some}
    str = nil
    let i: Int?  //如果声明的时候不赋值,默认就是nil
    
    //str.startIndex//会报错,因为此时str不是一个真正的String,所以没有startIndex
    
    //两种情况解决optional的问题
    //第一种
    //str!.startIndex //强制解封变为String
    //第二种,optional binding
    if let s = str {
        print("(s)")
    } else {
        print("str 是nil值")
    }
    var str2: String! = "sadf" //称之为隐式的解封(implicitly unwrapped)
    str2 = nil
    
    str2.startIndex//报错

    在swift中是不允许变量赋值为nil  也就是其他语言中的 null  空值  因为造成程序错误的大多数是空指针异常

    但是可选变量可以赋值为nil   因为他相当于把当前类型变量与nil值做了一个封装  变成一个拥有两个成员的对象

    使用时需要进行解封  前面一种用流程空值语句判断可行  但太繁杂 而!强制解封一旦解封出来的变量值是nil  程序就会出错

    最后的隐式解封声明方式也比较鸡肋  一旦该变量赋值为nil  再次访问则会报错

    最安全的访问解封方式是问号? 前面代码最后一句访问时变成

    str2?.starIndex

    则如果str2是nil值就直接无视   不会因为错误而终止程序

    可选链

    我们定义三个类,并将一个类封装进另一个类再封装进另一个类(有点晕,看代码)

    class Person {
        var ci: ClassInfo?
    }
    class ClassInfo {
        var t:Teacher?
    }
    class Teacher {
        var name = "hello"
    }

    我们实例化一个Person并访问其属性对其进行实例化

    let p = Person()
    let ci = ClassInfo()
    ci.t = Teacher()
    p.ci = ci
    
    p.ci.t.name//报错

    为什么会报错呢?因为类的定义中 ci 和 t 的属性都是可选的   不进行解封是无法使用的  访问方式就变成了这样

    p.ci?.t?.name

    当然也能使用强制解封   不过如果某一个可选属性是nil则程序会终止

    p.ci!.t!.name  //可以强制解封

    最后一种可选绑定安全的一种

    if let n = p.ci?.t?.name { //也可以用可选绑定
      print(n)  
    }

    这个表达式的意思是对n进行赋值操作  如果等号右边取出的值最终为nil 则会赋值失败(没加可选的变量是无法赋值为nil的)  表达式返回false

    可选链有以下几点

    1.可选链一定要是可选的

    2.返回的总是一个可选的

    3.可以设置值(并非只能访问)

    4.可以访问方法,即使方法无返回值

  • 相关阅读:
    九宫格小游戏源码分享
    DeviceOne 竟然做出来如此复杂的App
    DeviceOne 让你一见钟情的App快速开发平台
    MySQL初始化
    MySQL的操作
    MySQL
    Library
    Python模块
    Anaconda的使用
    面向对象之成员修饰 特殊成员 methclass
  • 原文地址:https://www.cnblogs.com/pengser/p/4972797.html
Copyright © 2020-2023  润新知