学习可选链的前提我们要对可选类型进行复习,可以参考我之前写的这篇博客Object-C—>Swift之(二)可选类型
个人理解可选链建立在可选类型的基础上,可选类型操作的是某个变量,而可选链操作的是某几个类
围绕今天是猴年正月二十一为题材,学习一下这个可选链
class Animalsign
{
var animal=""
var month:Month!
init(animal:String)
{
self.animal=animal
}
}
class Month {
var month=""
var day:Day!
init(month:String)
{
self.month=month
}
}
class Day{
var day=""
init(day:String)
{
self.day=day
}
}
上边定义了三个类分别代表年月日,注意看下面的输出代码:
第一份输出代码:常规逻辑
var animal=Animalsign(animal:"猴年")
var month=Month(month:"正月")
animal.month=month
var day=Day(day:"二十一")
month.day=day
print("\(animal.month!.day.day)")
perfect!完美的输出了二十一
第二份输出代码:见证奇迹的时候
var animal=Animalsign(animal:"猴年")
print("\(animal.month!.day.day)")
当我们Com+R运行的时候崩溃了,为什么呢?显然我们的月份和日都没有赋值,而我们就进行输出,就造成了崩溃。是不是很苦恼呀,因此可选链就应运而生了
将上面的访问链中的的强制解析的感叹号(!)换成问号(?)就构成了可选链的访问方式,即使在隐式解析后面也得加上问号(本来按可选类型的隐式是可以省略的,但这里是不行)
即把第二份代码改为
var animal=Animalsign(animal:"猴年")
print("\(animal.month?.day?.day)")
此时输出的值为nil,而不会进行崩溃