码迷,mamicode.com
首页 > 编程语言 > 详细

Swift 可选链-备

时间:2016-05-03 10:42:38      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:

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

 

可选链:

类图:

技术分享

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

下面看示例代码:

 

  1. class Employee {     
  2.   
  3.     var no: Int = 0  
  4.   
  5.     var name: String = "Tony"  
  6.   
  7.     var job: String?  
  8.   
  9.     var salary: Double = 0  
  10.   
  11.     var dept: Department = Department()   
  12.   
  13. }  
  14.   
  15.    
  16.   
  17. class Department {   
  18.   
  19.     var no: Int = 10  
  20.   
  21.     var name: String = "SALES"  
  22.   
  23.     var comp: Company = Company()  
  24.   
  25. }  
  26.   
  27.    
  28.   
  29. class Company {      
  30.   
  31.     var no: Int = 1000  
  32.   
  33.     var name: String = "EOrient"  
  34.   
  35. }  
  36.   
  37.    
  38.   
  39. let emp = Employee()   //Employee实例  
  40.   
  41. print(emp.dept.comp.name)  //  

 

 

 

 

 

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

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

修改代码如下:

 

 

  1. class Employee {  
  2.     var no: Int = 0  
  3.     var name: String = "Tony"  
  4.     var job: String?  
  5.     var salary: Double = 0  
  6.     var dept: Department?   // = Department()   
  7. }  
  8.   
  9. class Department {  
  10.     var no: Int = 10  
  11.     var name: String = "SALES"  
  12.     var comp: Company? // = Company()  
  13. }  
  14. class Company {  
  15.     var no: Int = 1000  
  16.     var name: String = "EOrient"  
  17. }  
  18. let emp = Employee()  
  19. print(emp.dept!.comp!.name) //显示拆包  
  20. print(emp.dept?.comp?.name) //可选链  

 

 

 

 

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

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

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

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

 

Swift 可选链-备

标签:

原文地址:http://www.cnblogs.com/isItOk/p/5454034.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!