zoukankan      html  css  js  c++  java
  • 《从零开始学Swift》学习笔记(Day 26)——可选链

    原创文章,欢迎转载。转载请注明:关东升的博客

    在Swift程序表达式中会看到问号(?)和感叹号(!),它们代表什么含义呢?这些符号都与可选类型和可选链相关,下面来看看可选链。 

    可选链:

    类图:

                           

    它们之间是典型的关联关系类图。这些类一般都是实体类,实体类是系统中的人、事、物。Employee通过dept属性与Department关联,Department通过comp属性与Company关联。

    下面看示例代码:

    class Employee {  
    
        var no: Int = 0
    
        var name: String = "Tony"
    
        var job: String?
    
        var salary: Double = 0
    
        var dept: Department = Department()
    
    }
    
     
    
    class Department {
    
        var no: Int = 10
    
        var name: String = "SALES"
    
        var comp: Company = Company()
    
    }
    
     
    
    class Company {   
    
        var no: Int = 1000
    
        var name: String = "EOrient"
    
    }
    
     
    
    let emp = Employee()   //Employee实例
    
    print(emp.dept.comp.name)  //

    emp.dept.comp.name可以引用到Company实例,形成一个引用的链条,但是这个“链条”任何一个环节“断裂”都无法引用到最后的目标(Company实例)。

    给定一个Employee实例,一定会有一个Department与其关联。但现实是一个新入职员工未必有部门,这种关联关系有可能有值,也有可能没有值,我们需要使用可选类型(Department?)声明dept属性。

    修改代码如下:

    class Employee {
    
        var no: Int = 0
    
        var name: String = "Tony"
    
        var job: String?
    
        var salary: Double = 0
    
        var dept: Department?   // = Department()
    
    }
    
     
    
    class Department {
    
        var no: Int = 10
    
        var name: String = "SALES"
    
        var comp: Company? // = Company()
    
    }
    
    class Company {
    
        var no: Int = 1000
    
        var name: String = "EOrient"
    
    }
    
    let emp = Employee()
    
    print(emp.dept!.comp!.name)    //显示拆包
    
    print(emp.dept?.comp?.name)    //可选链

    其中可选类型的引用,可以使用感叹号(!)进行显示拆包,代码修改如下:

    print(emp.dept!.comp!.name)

    但是显示拆包有一个弊端,如果可选链中某个环节为nil,将会导致代码运行时错误。我们可以采用更加“温柔”的引用方式,使用问号(?)来代替原来感叹号(!)的位置,如下所示:

    print(emp.dept?.comp?.name)

    欢迎关注关东升新浪微博@tony_关东升。
    关注智捷课堂微信公共平台,了解最新技术文章、图书、教程信息
      ​
    更多精品iOS、Cocos、移动设计课程请关注智捷课堂官方网站:http://www.zhijieketang.com
    智捷课堂论坛网站:http://51work6.com/forum.php

  • 相关阅读:
    【原】Sql2005 实现递归
    asp.net core api路由及多语言切换的实现
    一条语句实现查询各类别前10条记录
    【转】javascript操作cookies 以及 正确使用cookies的属性
    php 文件POST上传的原理及实现
    css3对background的调整与增强
    浅议javascript 中继承模式 (javascript高级程序设计)
    递归和递推:javascript求斐波那契数列的尾递归方法(转载)
    python中xrange和range的异同
    [译] JavaScript核心指南(JavaScript Core) 【转】
  • 原文地址:https://www.cnblogs.com/iOS-Blog/p/4904575.html
Copyright © 2011-2022 走看看