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

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

可选链:

类图:

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

下面看示例代码:

class Employee {  

    var no: Int = 

    var name: String = "Tony"

    var job: String?

    var salary: Double = 

    var dept: Department = Department()

}

class Department {

    var no: Int = 

    var name: String = "SALES"

    var comp: Company = Company()

}

class Company {   

    var no: Int = 

    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 = 

    var name: String = "Tony"

    var job: String?

    var salary: Double = 

    var dept: Department?   // = Department()

}

class Department {

    var no: Int = 

    var name: String = "SALES"

    var comp: Company? // = Company()

}

class Company {

    var no: Int = 

    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

最新文章

  1. mysql中Invalid default value for 'stime'问题
  2. jsp/servlet 中sendRedirect,include,forward区别
  3. Java 密码扩展无限制权限策略文件
  4. 企业模式之Unit Of Work模式
  5. 【BZOJ】1934: [Shoi2007]Vote 善意的投票(网络流/-二分图匹配)
  6. spring beans源码解读之--Bean的定义及包装
  7. 结对开发:7-magic用户调研报告
  8. iOS:自动布局Autolayout
  9. jQuery 遍历用法
  10. opennebula 编译日志
  11. jQuery各种效果举例
  12. Java编程思想——类型信息(RTTI)
  13. 前端XSS相关整理
  14. jqGrid选中行、格式化、自定义按钮、隐藏
  15. 寒假集训——搜索 D - Cubes for Masha
  16. 配置iSCSI部署网络存储
  17. Jrebel不生效的原因和解决办法
  18. L203 词汇题
  19. 集成 ActiveMQ 到应用服务器
  20. Java基础--单例类创建和测试

热门文章

  1. C#秘密武器之LINQ to SQL
  2. S6:组合模式 Composite
  3. 别样JAVA学习(六)继承下(2.3)异常下
  4. 一张图片教会你写mysql 语句
  5. 微信小程序flex容器属性详解
  6. CHAPTER ONE LOAD-BALANCING
  7. 【Python3 爬虫】05_安装Scrapy
  8. mac下安装python pip、pyspider
  9. 安装SDK后打开安卓project后有例如以下错误:发现了以元素 'd:skin' 开头的无效内容。此处不应含有子元素。
  10. CentOS-6.*安装配置SVN