Swift文档Chapter 16 可选链
可选链式调用是在当前值可能是nil的情况下请求和调用属性、方法以及下标的方法。
- 如果可选值有值,那么调用成功;
- 如果可选值为
nil,那么调用返回nil。多个调用连在一起形成调用链,任何一个节点为nil,最终的结果都是nil。
使用可选链式调用代替强制展开
在想要调用的属性,方法或下标后加上?就可以定义一个可选链。
为了能够在可选链上返回空值nil,不论这个属性,方法或者下标返回值是不是可选值,返回结果都是可选值。可以对返回值判断是不是nil判断是否调用成功。
可选链返回类型和原类型完全相同,只不过包装成了可选值。
可选链式调用和强制展开的不同
我们定义:
class Person {
var residence: Residence?
}
class Residence {
var numberOfRooms = 1
}
其中,residence属性是可选的,如果我们定义了Person类的实例:
let john = Person()
那么residence属性默认是nil.如果我们用!访问的话,会发生错误,因为这个属性为nil不能被强制展开。
let roomCount = john.residence!.numberOfRooms
//会发生错误
我们可以使用?进行访问:
if let roomCount = john.residence?.numberOfRooms {
print("John's residence has \(roomCount) room(s).")
} else {
print("Unable to retrieve the number of rooms.")
}
// 打印“Unable to retrieve the number of rooms.”
此时,如果residence不是nil,那么会访问它的属性并返回结果。当然,这个属性也可能会访问失败,那么返回值不再是Int,而是Int?。
通过可选链式调用访问属性
如果对于一个可选的属性使用?访问后进行赋值,如果可以访问,那么会进行赋值。如果无法访问,那么等式右端的表达式失效。
通过可选链式调用来调用方法
对于方法来说,即使是一个没有返回值Void的函数,那么返回的结果依然是Void?,依然可以通过条件判断是否为nil。
通过可选链式调用访问下标
下标访问时,?应当是放在中括号前面。如果下标不存在,那么也会返回nil.
对于Dictionary类型,我们也可以使用可选链式访问判断一个键值是否存在。
连接多层可选链式调用
可以通过可选链访问更深层的可选链。多层可选链式调用不会增加返回值的可选层级。
- 如果访问值不可选,可选链式调用会让返回值可选;
- 如果访问值可选,可选链式调用会让返回值“更可选”。如果返回值是
Int?,那么可选链式调用依然是Int?,而不是Int??。
在方法的可选返回值上进行可选链式调用
我们还可以在一个可选值上通过可选链式调用来调用方法,并且可以根据需要继续在方法的可选返回值上进行可选链式调用。如果要在该方法的返回值上进行可选链式调用,在方法的圆括号后面加上问号即可。