Swift 可选链-备

时间:2023-03-10 01:17:15
Swift  可选链-备

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

可选链:

类图:

Swift  可选链-备

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

下面看示例代码:

  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. class Department {
  9. var no: Int = 10
  10. var name: String = "SALES"
  11. var comp: Company = Company()
  12. }
  13. class Company {
  14. var no: Int = 1000
  15. var name: String = "EOrient"
  16. }
  17. let emp = Employee()   //Employee实例
  18. 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. class Department {
  9. var no: Int = 10
  10. var name: String = "SALES"
  11. var comp: Company? // = Company()
  12. }
  13. class Company {
  14. var no: Int = 1000
  15. var name: String = "EOrient"
  16. }
  17. let emp = Employee()
  18. print(emp.dept!.comp!.name) //显示拆包
  19. print(emp.dept?.comp?.name) //可选链

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

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

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

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