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??
。
在方法的可选返回值上进行可选链式调用
我们还可以在一个可选值上通过可选链式调用来调用方法,并且可以根据需要继续在方法的可选返回值上进行可选链式调用。如果要在该方法的返回值上进行可选链式调用,在方法的圆括号后面加上问号即可。