可选链

前端之家收集整理的这篇文章主要介绍了可选链前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

学习可选链的前提我们要对可选类型进行复习,可以参考我之前写的这篇博客Object-C—>Swift之(二)可选类型

个人理解可选链建立在可选类型的基础上,可选类型操作的是某个变量,而可选链操作的是某几个类

围绕今天是猴年正月二十一为题材,学习一下这个可选链

  1. class Animalsign
  2. {
  3. var animal=""
  4. var month:Month
  5. init(animal:String)
  6. {
  7. self.animal=animal
  8. }
  9. }
  10. class Month {
  11.  
  12. var month=""
  13. var day:Day!
  14. init(month:String)
  15. {
  16. self.month=month
  17. }
  18. }
  19. class Day{
  20. var day=""
  21.  
  22. init(day:String)
  23. {
  24. self.day=day
  25. }
  26. }

上边定义了三个类分别代表年月日,注意看下面的输出代码

第一份输出代码:常规逻辑

  1. var animal=Animalsign(animal:"猴年")
  2. var month=Month(month:"正月")
  3. animal.month=month
  4. var day=Day(day:"二十一")
  5. month.day=day
  6. print("\(animal.month!.day.day)")

perfect!完美的输出了二十一


第二份输出代码:见证奇迹的时候

  1. var animal=Animalsign(animal:"猴年")
  2. print("\(animal.month!.day.day)")

当我们Com+R运行的时候崩溃了,为什么呢?显然我们的月份和日都没有赋值,而我们就进行输出,就造成了崩溃。是不是很苦恼呀,因此可选链就应运而生了

将上面的访问链中的的强制解析的感叹号(!)换成问号(?)就构成了可选链的访问方式,即使在隐式解析后面也得加上问号(本来按可选类型的隐式是可以省略的,但这里是不行)

即把第二份代码改为

  1. var animal=Animalsign(animal:"猴年")
  2. print("\(animal.month?.day?.day)")

此时输出的值为nil,而不会进行崩溃


当可选值为空时可选链即刻失败,然而一般的强制解析将会引发运行时错误。可选链可以处理各类之间的属性方法、下标等的,在这里我只举了属性,其他的就不一一举例说明了,作为一名优秀的程序员还是要慢慢锻炼有触类旁通的能力。其他的在形式上无外乎加上问号(?),但其中的意义之处要细细品味,原理机制要明白。

猜你在找的Swift相关文章