资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

Swift可选类型和可选链

一、可选类型

创新互联建站技术团队十余年来致力于为客户提供成都做网站、网站建设、高端网站设计成都营销网站建设、搜索引擎SEO优化等服务。经过多年发展,公司拥有经验丰富的技术团队,先后服务、推广了1000+网站,包括各类中小企业、企事单位、高校等机构单位。

    有时候在Swift程序的表达式可以看到?和!等符号,它们代表的含义是什么,这些符号都和可选类型有关。

    有时候使用一个变量和常量,它保存的值可能有也可能没有

    1、比较给一个变量赋值nil,需要下面的表达式赋值

    class Empoyee{
        var  int : = 0
        var name:String = ""
        var job : String =""
}
    var emp : Employee? = nil //后面加上?号可以接受空值,不加?不能赋予空值
    emp1=Employee()
    println(emp!.no)

        如果Employee?没有赋值,调用它的成员的时候可能出现fatal error:unexpected found nil while upwrapping an optional value.

    2、引用代码

        emp1?.no=1000
        emp1?.name="张三"
        emp1?.job="clerk"

    3、再看示例

        func divided(n1:Int,n2:Int)->Double?{
            if n2==0{
            return nil
}
        Double(n1)/Double(n2)
}
    let result : Double? = divide(100,200)

    使用原则:如果一个常量、变量或函数能够接受nil空值,那就需要给这个类型设为可选类型(正常类型+?),允许接受nil控制则是正常类型

    (1)强制拆封

        如果我们能确定可选类型一定有值,那么在读取它的时候,可以在可选类型的后面加一个感叹号(!)来获取该值,这种感叹号的表达方式称为可选类型的强制拆封,如下代码所示:

        let result1 :Double? = divided(10,20)

        println(result1!)

        println对result1中的语句进行了强制拆封

        

        前问号,后感叹号,强制拆封

    (2)隐式拆封

            

            为了能够方便的访问可选类型,可以将可选类型后面的问号改成感叹号(!),这种可选类型在拆封时变量和常量不加感叹号的方式称为隐式拆封,如下代码所示:

                let result3 : Double! = divided(10,20)

                 println(result3)

        在变量或常量声明的时候,数据类型后面跟的是感叹号而不是问号,在拆封的时候,变量或常量后面不用加感叹号,这就是隐式拆封,隐式拆封的变量或常量使用起来就像普通变量或常量一样

            前感叹后省略,隐式拆封

      (3)可选类型的绑定

            可选类型赋值有风险性,可以先判断再赋值,如下代码所示:

        func divided(n1:Int,n2:Int)->Double?{
            if n2==0{
            return nil
}
        Double(n1)/Double(n2)
}

    if let result : Double = divided(10,20) {
    let sum = 10.2 + result
    
    println(sum)
    
}

          调用函数进行计算,然后把结果直接赋值给变量或常量,如果result不为nil,则if语句的逻辑变大时为true, 这种可选类型在if 或while语句中进行判断赋值,叫做可选绑定。      

二、可选链

      class Empoyee {
            var no:Int = 0
            var name : String = "tony"
            var job:String? = ""
            var salary:Double = 0
            var dept : Deartment = Department()
}
            class Department {
            var no : Int = 0
            var name:String = "sales"
            var com:Company = Company()
}
            class Company {
                var no : Int = 0
                var name : String = ""
}
        var emp = Employee()
        println(emp.dept.com.name)

        给定一个Employee实例,通过代码emp.dept.com.name 可以引用到Company实例,形成一个引用的链条,但是这个链条的人一个环节断裂,都无法引用到最后的目标。

        修改代码如下:

            

        2、Employee、Department,Company可以没有对应关系

      class Empoyee {
            var no:Int = 0
            var name : String = "tony"
            var job:String? = ""
            var salary:Double = 0
            var dept : Deartment? = Department()
}
            class Department {
            var no : Int = 0
            var name:String = "sales"
            var com:Company? = Company()
}
            class Company {
                var no : Int = 0
                var name : String = ""
}
        var emp = Employee()
        println(emp.dept!.com!.name)

        但是强制拆封有一个弊端,如果可选链中某个环节为nil,将会导致代码运行时错误,可以采用更加温柔的引用方式,使用问号?来代替感叹号!,如下所示:

            

        println(emp.dept?.com?.name)

            ?问号表示引用的时候,如果某个环节为nil,她不会出现错误,而是把nil返回给引用者,这种使用问号引用可选类型的方式叫做可选链

三、使用问号?和感叹号!的总结

        1、可选类型中的问号?

            声明这个类型为可选类型,访问这种类型的常量或变量时要使用感叹号!

        2、可选类型中的感叹号!

            声明这个类型也是可选类型,但是访问这种类型的常量或变量时不适用感叹号!,下列代码是隐式拆封:

            let result3 : Double! = divide(10,20)

             println(result3)

          3、可选类型中的感叹号

            多个对象具有关联关系,当从一个对象引用另一个对象的方法、属性和下标的成员时,就会形成引用链,由于这个链条某些环节可能有钱,有些可能没值,因此需要如下方法引用:

            emp.dept!.com!.name

            4、可选链中的问号

            在可选链中使用感叹号访问时,一旦链条某些环节没值,程序将会发生异常,于是可把感叹号改成问号,如下所示:

            emp.dept?.com?.name

              这样某些环节没值会返回nil,不会出现异常          

  


分享文章:Swift可选类型和可选链
文章起源:http://cdkjz.cn/article/ijojis.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

业务热线:400-028-6601 / 大客户专线   成都:13518219792   座机:028-86922220